【发布时间】:2018-04-10 17:26:06
【问题描述】:
我是 C 的新手,在使用 malloc 时遇到了奇怪的行为。
我从标准输入 (fgets) 读取输入文本并将其传递给函数 myfunction。
void myfunction(char* src) {
printf("src: |%s|\n", src);
int srcLength = strlen(src);
printf("src length: %d\n", srcLength);
// CAUSES ODD BEHAVIOR IN MY SITUATION
// char* output = malloc(200);
//
// if (output == NULL) {
// exit(EXIT_FAILURE);
// }
for (int i=0; i < srcLength; ++i) {
char currChar = src[i];
printf("|%c| ", currChar);
}
}
在没有 malloc 的情况下执行函数时(见评论),我得到这个:
src: |asdf|
src length: 4
|a| |s| |d| |f|
但是使用 malloc,我得到了这种尴尬的行为。好像 char* 中没有字符:
src: |asdf|
src length: 4
|| || || ||
char* src(来自标准输入)可能存在问题。但我不确定,因为输入字符串打印正确(src: |asdf|)。
谁能支持我,如何分析问题的根源?
更新 1:
这是从标准输入读取并调用 myfunction 的代码。
int main(int argc, char **argv) {
char *input = NULL;
input = readStdin();
myfunction(input);
return EXIT_SUCCESS;
}
char* readStdin(void) {
char buffer[400];
char *text = fgets(buffer, sizeof(buffer), stdin);
return text;
}
myfunction 和 readStdin 在不同的文件中,但我希望没关系。
更新 2:
根据 cmets 支持者的建议,我解决了范围问题。
我把readStdin的函数原型改成:
char* readStdin(char* input);
然后我用分配的input 调用readStdin。
char* input = malloc(400);
在readStdin我用函数参数替换了buffer。
【问题讨论】:
-
你能显示你从标准输入读取字符串的代码吗?如果将源字符串的打印移到 malloc 之后会发生什么?那些输出之间的唯一区别是您取消注释该代码行还是您更改了打印语句的来源?
-
您需要发布minimal reproducible example。
malloc()对您的代码没有明显影响,但如果您在其他地方损坏了堆,即使是看似无害的代码也可能导致出现潜在问题。 -
如果
malloc()在src 的printf()之前完成会怎样?我想知道是否仍然正确打印src。 -
所以,很明显你已经破坏了代码中其他地方的堆。请将代码发布在您从标准输入读取字符串的位置以及调用此方法的位置。如前所述,请发帖MCVE
-
一旦您离开
readStdin,buffer将失效。访问它是未定义的行为,你应该避免。 (我猜问题不是malloc,而是附加变量output,恰好占据了buffer之前占用的部分空间,从而破坏了它。)