在这段代码中,我希望得到一些朋友,然后得到我想要的名字,字符串将动态分配用户输入的长度,我用2个函数:
void getNum(char** names, int* num)
{
//somecode
names = (char*)malloc(*num * sizeof(char));
//check
}
void getNames(char** names, int* num)
{
int i = 0;
int len = 0;
char name[LEN] = { 0 };
getchar(); //buffer cleaning
for (i = 0; i < *num; i++)
{
printf("enter #%d friend name: ", i+1);
myFgets(name, LEN); //getting name and cleaning "\n" at end
len = strlen(name)+1; // getting the size of string include "/0"
*(names + i) = (char*)malloc(len * sizeof(char));
if (*(names[i]) == NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
strncpy(*names, name, len);
}
}
第二个动态分配对我不起作用,溢出错误:“访问违规写入位置”。如果第一次分配将在第二个函数中,它将正常工作。你可以解释一下吗?我需要做什么才能以这种方式运作? 提前谢谢你......
答案 0 :(得分:2)
在函数getNames
中,您使用了错误的指针来检查NULL
,names[i]
是*(names+i)
,与*(names[i])
不同,也是不要施放malloc
的返回值。无需使用sizeof(char)
,它始终为1。
*(names + i) = (char*)malloc(len * sizeof(char));
if (*(names[i]) == NULL) // compare to the wrong pointer
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
strncpy(*names, name, len); // copy to the wrong buffer
尝试以下方法:
names[i] = malloc(len);
if (names[i] == NULL)
{
printf("Error allocating memory!\n");
return 1; //return with failure
}
strncpy(names[i], name, len);
另外,在getNum
中,要为char指针分配数组,请使用
void getNum(char ***names, int *num) {
*names = malloc(*num * sizeof(char*));
}
您将通过
调用它char **names;
getNum(&names, &num);
你也可以通过char **getNum(...)
返回它。
答案 1 :(得分:1)
假设第一个函数应该分配一个指针数组,并且第二个函数应该分配单个的char数组来存储各个名称,那么在第一个函数中缺少一个间接级别:
char**
的副本(C副本参数)应该是:
char** getNum(int num) /* no need to pass num by reference */
{
char **names;
//somecode
names = malloc(num * sizeof(char*)); /* do not cast resul of malloc in C */
//check
return names
}
在第二个函数中,你应该一致地为names[i]
(或*(names + i)
)分配内存,测试它为NULL并在那里复制字符串:
names[i] = malloc(len * sizeof(char));
if (names[i] == NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
strncpy(names[i], name, len);