2012-01-22 2 views
3

Я пытаюсь malloc 2-мерный массив в C, где каждая запись является строкой (так, я полагаю, является трехмерным массивом). Я много читал, и это моя попытка. Тем не менее, я получаю ошибку сегментации, и я действительно не уверен, что не так. Я новичок в программировании, поэтому извиняюсь, если мой стиль не очень хорош!malloc 2D-массив, где каждая запись является строкой, в C

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main(int argc, char *argv[]) 
{ 
    double temp, int_check; 
    int gen, exit_flag=0, valid_input, valid, i, j; 

    char ***S; 

    printf("argc %d\n", argc); 
    if(argc < 2) 
    { 
     printf("Please enter command line arguments of the form: a R where a is the number of generators and R are relators\n"); 
    exit_flag = 1; 
    } 
    else 
    { 
     valid = sscanf(argv[1], "%lg", &temp); 
     int_check = temp - (int)temp; 
     valid_input = ((valid != 0) && (valid != EOF)) && (int_check == 0) && (temp > 0); 

     if(!valid_input) 
     { 
      printf("Invalid input, the number of generators must be an integer > 0\n"); 
      exit_flag = 1; 
     } 
     gen = (int)temp; 

     printf("Number of generators = %d\n", gen); 
    } 

    if(exit_flag==0) 
    { 

     S = (char***)malloc(2*sizeof(char**));  /*Defintes the grid to the size required*/ 
     if(S == NULL) 
     { 
      printf("Cannot allocate memory for the S"); 
     } 

     for(i=0; i<2; i++) 
     { 
      S[i] = (char**)malloc((argc-2)*sizeof(char*)); 
      if(S[i] == NULL) 
      { 
       printf("Cannot allocate memory for the S"); 
      } 
     }             /*Grid finished being given the right size*/ 

     for(i=2; i<argc; i++)        /*Put the relators in the grid. Make rhs equal 1*/ 
     { 
      strcpy(S[0][i-2], argv[i]); 
      strcpy(S[1][i-2], "1"); 
      printf("relator %s\n", S[0][i-2]); 
     } 

     printf("The array S is\n"); 
     for(j=0; j<(argc-2); j++) 
     { 
      for(i=0; i<2; i++) 
      { 
       printf(" %s ", S[i][j]); 
      } 
      printf("\n"); 
     } 
    } 

    else /*If the inputs are invalid, exit the program*/ 
    { 
     exit(EXIT_FAILURE); 
    } 

    for(i=0; i<2; i++) 
    { 
     free(S[i]); 
    } 
    free(S); 

    return 0; 
} 

ответ

2

Вы никогда не выделять какую-либо памяти для реальных персонажей, только для различных указателей, указывающих на этих нужных символов. Добавьте выделение здесь:

for(i=2; i<argc; i++)  /* Put the relators in the grid. Make rhs equal 1*/ 
{ 
    S[0][i-2] = malloc(strlen(argv[i]) + 1); // allocate memory for the data 
    strcpy(S[0][i-2], argv[i]); 
    strcpy(S[1][i-2], "1"); 
    printf("relator %s\n", S[0][i-2]); 
} 

Не забудьте освободить весь беспорядок в конце.

Я не уверен, что повторные strcpy s делают то, что вы хотите; strcpy добавляет нулевой ограничитель, чтобы ваша строка заканчивалась там. Возможно, strncpy - более полезная функция для вашей ситуации.

+0

Большое спасибо за ваш ответ! Это действительно полезно, теперь я понимаю, что мне нужно назначить память для каждого символа строки. – user1163974

1

Ваша проблема в строках вроде strcpy(S[0][i-2], argv[i]);. Вы не выделили место для этой строки, и это указатель на мусор. Используйте вместо этого S[0][i-2]=strdup(argv[i]).

+0

Спасибо, теперь он работает с использованием strdup – user1163974

+0

'strdup' является POSIX, а не« стандартным »C.

+0

Спасибо. Я этого не помню. – asaelr

0

В этом коде есть много ошибок памяти. Иногда вы освобождаетесь без malloc'ing, в других случаях вы копируете строки, не проверяя их размер (поэтому строка может быть слишком большой для адресата), и вы никогда не выделяете память для строк.

+0

Нет, он хочет 'char *** S'. Это должен быть 2d массив строк. – asaelr

Смежные вопросы