gpt4 book ai didi

Char 数组在其指针在函数之间传递后损坏

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:38 25 4
gpt4 key购买 nike

我已经学习 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;
}

更新:感谢您的所有回答!非常感谢。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com