将数组解析和修改为函数时出错
Error in passing and modifying a array to a function
void retsom(char **page)
{
*page = (char*) malloc(sizeof(char) * 10);
*page[0] = 'a';
*page[1] = 'b';
}
void main()
{
char *page = NULL;
retsom(&page);
printf("%c %c",page[0],page[1]);
}
此代码出现分段错误。它在 *page[1] = 'b' 处给出分段错误;
我想传递一个数组来函数并修改它的内容。
如果您将自己与过多的间接联系混淆,您经常会遇到这样的问题。更好的是更改为:
void retsom(char ** page)
{
char * newpage = malloc(10);
if ( !newpage ) {
perror("couldn't allocate memory");
exit(EXIT_FAILURE);
}
newpage[0] = 'a';
newpage[1] = 'b';
*page = newpage;
}
并完全避免该问题。这还有一个好处,如果您想在 malloc()
或其他失败时终止,您还没有覆盖调用者提供的指针,因此您的函数在异常情况下表现更好。
请注意,根据定义,sizeof(char)
始终是 1
,因此是多余的,并且您不应在 C 中从 malloc()
强制转换 return。malloc()
也可能失败,所以你应该检查它的 return 值。
void retsom(char **page)
{
*page = (char*) malloc(sizeof(char) * 10);
*page[0] = 'a';
*page[1] = 'b';
}
void main()
{
char *page = NULL;
retsom(&page);
printf("%c %c",page[0],page[1]);
}
此代码出现分段错误。它在 *page[1] = 'b' 处给出分段错误;
我想传递一个数组来函数并修改它的内容。
如果您将自己与过多的间接联系混淆,您经常会遇到这样的问题。更好的是更改为:
void retsom(char ** page)
{
char * newpage = malloc(10);
if ( !newpage ) {
perror("couldn't allocate memory");
exit(EXIT_FAILURE);
}
newpage[0] = 'a';
newpage[1] = 'b';
*page = newpage;
}
并完全避免该问题。这还有一个好处,如果您想在 malloc()
或其他失败时终止,您还没有覆盖调用者提供的指针,因此您的函数在异常情况下表现更好。
请注意,根据定义,sizeof(char)
始终是 1
,因此是多余的,并且您不应在 C 中从 malloc()
强制转换 return。malloc()
也可能失败,所以你应该检查它的 return 值。