我是C新手,在使用 malloc 时遇到了奇怪的行为。
我从 stdin (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:
这是从 stdin 读取并调用 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:
正如支持者在评论中提出的那样,我解决了范围问题。
我将的函数原型更改readStdin
为:
char* readStdin(char* input);
我readStdin
用分配的input
.
char* input = malloc(400);
在readStdin
我替换buffer
为函数参数。
使用 malloc 时的奇怪行为
是的,这很奇怪……或者也许不是。您的代码具有未定义的行为,因此一切都可能发生。
问题是它text
最终会成为一个指向buffer
iffgets
是否成功的指针。但是buffer
是函数中的局部变量,因此一旦readStdin
返回该变量buffer
就不再存在。因此,您传递myfunction
了一个无效的指针,当您使用它(即读/写)时,您有未定义的行为。
一旦你有未定义的行为,就没有任何意义来推理正在发生的事情......但如果我们无论如何都尝试这样做,对大多数系统的可能解释是:
buffer
位于堆栈上。当readStdin
返回时,堆栈指针是递减(或递增),使得buffer
现在是在堆叠的未使用部分。当你调用一个新函数时,新函数也需要一些栈空间。多少取决于函数使用的变量数量。换句话说 - 变量越多,需要的堆栈空间就越多。由于新变量将覆盖堆栈的某些部分 - 从而覆盖保存过时buffer
变量的内存部分- 销毁buffer
的数量可能会随着函数调用中变量的数量而变化。这大概就是你看到的。
但请注意,上述解释是特定于系统的。它不是 C 标准指定的内容。尽管如此,这就是大多数系统的工作方式。
该怎么办?
代替
char buffer[400];
做
char* buffer = malloc(400);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句