我想用两个函数填充一个字符串数组:第一个,如果我有n个字符串要分配,将分配n个内存空间;第二个将为每个读取的字符串分配内存
这是第一个功能:
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);
}
}
我没有忘记像main
这样拨打第二个:fill(&t,n);
问题是我在读完第一个字符串并且程序结束后收到错误。
答案 0 :(得分:2)
这一行
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
。
答案 1 :(得分:0)
fill()
应该采用char * *
,我认为您会遇到运算符优先级问题。
由于您不需要在fill()
内重新分配数组,因此没有必要有三个间接级别。你应该把它改成只有两个,当然不用&
来打电话。
答案 2 :(得分:0)
问题是你没有为帮助变量分配内存。
将char* help=" ";
更改为char help[512]="";
这种方式帮助指向一个字符串文字(常量存储在内存块中,不允许更改。