【发布时间】:2017-03-28 07:54:09
【问题描述】:
我已经学习 C 几个星期了。我通过使用malloc() 在堆上分配一些内存解决了我的问题。我对我的代码失败的原因有所了解,但我不能 100% 确定。不幸的是,我是自学的,所以我不得不求助于互联网上的好心人。
代码说明调用声明数组的函数getString(),使用内置的getchar() 填充数组并返回指向该数组的指针。
问题我打印了返回的指针值,一切都很好。但是当我将它传递给另一个简单地将其吐出并尝试打印它的函数时,字符串的结尾被切断,有时它会吐出一个无意义的字符。
我认为可能发生的事情 原始数组仅在 getString() 函数中使用,因此 C 正在使用数组地址中的一些内存来存储其他内容。
我的直觉正确吗?如果没有,有人可以指出我正确的方向吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
char * getString(void);
char * doSomethingWith(char *);
int main(void)
{
char *string1 = getString();
printf("String: %s\n", string1);
char *string2 = doSomethingWith(string1);
printf("String: %s\n", string2); // This print out is unreliable!
return EXIT_SUCCESS;
}
char * getString(void) {
int c;
char arr[MAXLEN];
char *string = arr;
char *cur = arr;
while((c = getchar()) != '\n' && c != EOF) {
if(cur - string < MAXLEN - 2) {
*cur++ = c;
}
}
*cur = '\0'; // Terminate string
return string;
}
char * doSomethingWith(char *string) {
return string;
}
这是我修改后的 getString() 行为正确。
char * getString(void) {
int c;
char *string = malloc(sizeof *string * MAXLEN);
char *cur = string;
while((c = getchar()) != '\n' && c != EOF) {
if(cur - string < MAXLEN - 2) {
*cur++ = c;
}
}
*cur = '\0'; // Terminate string
return string;
}
更新:感谢所有回答!非常感谢。
【问题讨论】:
-
是的,您有未定义的行为,因为您使用的是堆栈上下文中有效的堆栈外部上的变量地址。我很高兴看到您在问题中提到
malloc,但我没有看到它在代码中的任何地方使用。 -
谢谢!抱歉,我发布了损坏的代码,因为我想确认是这种情况!我也会用我的修复来更新我的答案。