将内存分配给字符串数组
我想用两个函数填充一个字符串数组:第一个,如果我有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()
重新分配数组,因此没有必要具有三个间接级别。 你应该把它改成两个,当然不用&
调用。