在函数中通过指针修改 char* 会导致崩溃
Modifying a char* by pointer in a function gives a crash
我是 C 的新手,我正在尝试计算动态内存分配以从文件中读取。至少我认为这就是我正在做的。
无论如何,这段代码有效:
int readfromfile(FILE *filepointer)
{
size_t size = 2;
char *str = (char *) malloc(sizeof(char));
int character = 0;
size_t counter = 0;
while((character = fgetc(filepointer)) != EOF)
{
str = (char *) realloc(str, size);
str[counter] = (char) character;
size ++;
counter++;
}
str[counter] = '[=10=]';
printf("+%s+", str);
free(str);
return 0;
}
而这段代码没有:
int main()
{
char *str = (char *) malloc(sizeof(char));
...
readfromfile(ifpointer, &str);
}
int readfromfile(FILE *filepointer, char **str)
{
size_t size = 2;
int character = 0;
size_t counter = 0;
while((character = fgetc(filepointer)) != EOF)
{
*str = (char *) realloc(*str, size);
*str[counter] = (char) character;
size ++;
counter++;
}
str[counter] = '[=11=]';
printf("+%s+", *str);
free(str);
return 0;
}
我不明白为什么,因为据我所知,我每次都将指向 char 数组位置的指针发送给函数并访问数据。编译器没有显示任何错误消息,它只是循环一次,并且在每次 realloc
之后的第二个循环中崩溃。分配给第一个值的字符也是垃圾。
我花了很长时间试图让它发挥作用并进行了大量研究,所以如果我错过了解决方案,我深表歉意,但我真的被困在这一点上。
你崩溃是因为
*str[counter] = (char) character;
与
相同
*(str[counter]) = (char) character;
相对于
(*str)[counter] = (char) character;
这正是您想要的。阅读 Operator Precedence on Wikipedia。您会发现 []
比 *
(取消引用运算符)具有更高的优先级。
此外,这里的转换以及对 realloc
和 malloc
的调用是不必要的。不要忘记检查 realloc
、malloc
等的 return 值,看看它们是否成功分配内存。
现在,你有另一个问题:第二个代码中的 free(str);
应该是 free(*str);
。请注意,在 *str
从函数中释放后,您不应该从 main
读取或写入此内存位置,因为它现在已变得无效,您无法篡改。
在您的 int readfromfile(FILE *filepointer, char **str)
中,参数 char **str
实际上与 char *str[]
相同,这意味着 **str
需要一个字符指针数组。但是你传递给它 char *str
这只是一个 char
的数组
当你使用 readfromfile(...) 时,你应该这样做(类似于...):
char *str[2] = {"some char array", "another char array"};
readfromfile(ifpointer, str);
或:
char *a = "this char array";
char **str = &a[0];
readfromfile(ifpointer, str);
你会明白的...
我是 C 的新手,我正在尝试计算动态内存分配以从文件中读取。至少我认为这就是我正在做的。
无论如何,这段代码有效:
int readfromfile(FILE *filepointer)
{
size_t size = 2;
char *str = (char *) malloc(sizeof(char));
int character = 0;
size_t counter = 0;
while((character = fgetc(filepointer)) != EOF)
{
str = (char *) realloc(str, size);
str[counter] = (char) character;
size ++;
counter++;
}
str[counter] = '[=10=]';
printf("+%s+", str);
free(str);
return 0;
}
而这段代码没有:
int main()
{
char *str = (char *) malloc(sizeof(char));
...
readfromfile(ifpointer, &str);
}
int readfromfile(FILE *filepointer, char **str)
{
size_t size = 2;
int character = 0;
size_t counter = 0;
while((character = fgetc(filepointer)) != EOF)
{
*str = (char *) realloc(*str, size);
*str[counter] = (char) character;
size ++;
counter++;
}
str[counter] = '[=11=]';
printf("+%s+", *str);
free(str);
return 0;
}
我不明白为什么,因为据我所知,我每次都将指向 char 数组位置的指针发送给函数并访问数据。编译器没有显示任何错误消息,它只是循环一次,并且在每次 realloc
之后的第二个循环中崩溃。分配给第一个值的字符也是垃圾。
我花了很长时间试图让它发挥作用并进行了大量研究,所以如果我错过了解决方案,我深表歉意,但我真的被困在这一点上。
你崩溃是因为
*str[counter] = (char) character;
与
相同*(str[counter]) = (char) character;
相对于
(*str)[counter] = (char) character;
这正是您想要的。阅读 Operator Precedence on Wikipedia。您会发现 []
比 *
(取消引用运算符)具有更高的优先级。
此外,这里的转换以及对 realloc
和 malloc
的调用是不必要的。不要忘记检查 realloc
、malloc
等的 return 值,看看它们是否成功分配内存。
现在,你有另一个问题:第二个代码中的 free(str);
应该是 free(*str);
。请注意,在 *str
从函数中释放后,您不应该从 main
读取或写入此内存位置,因为它现在已变得无效,您无法篡改。
在您的 int readfromfile(FILE *filepointer, char **str)
中,参数 char **str
实际上与 char *str[]
相同,这意味着 **str
需要一个字符指针数组。但是你传递给它 char *str
这只是一个 char
当你使用 readfromfile(...) 时,你应该这样做(类似于...):
char *str[2] = {"some char array", "another char array"};
readfromfile(ifpointer, str);
或:
char *a = "this char array";
char **str = &a[0];
readfromfile(ifpointer, str);
你会明白的...