将内存分配给字符串数组

我想用两个函数填充一个字符串数组:第一个,如果我有n个字符串要分配,将分配n个内存空间; 第二个将为每个读取的字符串分配内存

这是第一个function:

char** allocate(int n) { char** t; t=(char**)malloc(n*sizeof(char*)); if(!t) exit(-1); return t; } 

这是第二个:

 void fill(char*** t,int n) { int i; char* help=" "; for(i=0;i<n;i++) { printf("\n saisir la chaine n %d :",i+1); scanf("%s",help); *t[i]=(char*)malloc((strlen(help)+1)*sizeof(char)); strcpy(*t[i],help); } } 

我没有忘记像这样打电话给第二个: fill(&t,n);

问题是我在读完第一个字符串并且程序结束后出错。

问题是您没有为帮助变量分配内存。

改变char* help=" "; to char help[512]="";

这种方式有助于指向字符串文字(常量存储在内存块中,不允许更改)。

这条线

 char* help=" "; 

只定义一个指向" "的指针。

没有分配内存然后通过scanf()存储要扫描的数据。

如果您要扫描的字符数最多,请执行以下操作:

 #define SCAN_MAXIMUM (255) #define SCAN_FMT_STRINGIFY(max) "%"#max"s" #define SCAN_FMT(max) SCAN_FMT_STRINGIFY(max) ... char help[SCAN_MAXIMUM + 1]; /* Add one for the road^H^H^H^H`0`-terminator. */ scanf(SCAN_FMT(SCAN_MAXIMUM), help); 

这些行也不是你想要的:

  *t[i]=(char*)malloc((strlen(help)+1)*sizeof(char)); strcpy(*t[i],help); 

[]运算符比*运算符更紧密,所以行应该看起来像

  (*t)[i] = malloc((strlen(help) + 1)); strcpy((*t)[i], help); 

另外^ 2:C中没有必要转换malloc/calloc/realloc的结果,也不需要推荐它。


此外,^ 3: sizeof(char)被定义为等于1

fill()应该只取char * * ,我认为你的运算符优先级问题。

由于您不需要在fill()重新分配数组,因此没有必要具有三个间接级别。 你应该把它改成两个,当然不用&调用。