gpt4 book ai didi

c - 从 C 函数中创建的数组返回数组元素?

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

在 C 中这样做合适吗?

char *func1() {
char *str[3] = { "so", "is", "amazing" };

return str[1];
}

char *func1() 返回一个指针,指向内存中存储字符串的位置。但是,当 func1() 返回时,str 数组不会超出范围,我是否没有返回指向不存在的对象的指针?悬挂指针(这个名字对吗?)

所以我有两个解决方案使 str 成为全局的,这样它就永远不会超出范围,并且指针总是指向有效的内存地址,但这看起来很脏。

其他解决方案

char *func2() {
char *str[3] = { "so", "is", "amazing" };
int str1Len = strlen(str[1]);
char *ret = (char *)malloc(str1Len) ; // create a block of mem to hold the str[1].
strncpy(ret, str[1], str1Len);
return ret;
}

这是正确的吗?执行此 func1()func2() 的正确方法是什么?或者有更好的方法吗?

我已经使用 func1() 一段时间了,它没有给我带来任何问题,这是否意味着 func1() 正在做正确的事情?和 func2() 是不必要的吗?

最佳答案

在您的第一个函数中,返回 str[1] 没有问题,因为它不指向局部变量,而是指向字符串文字的指针。请注意,字符串文字应声明为 const:

const char *func1(void) {
const char *str[3] = { "so", "is", "amazing" };
return str[1];
}

您的第二个函数返回指向已分配空间的指针。这个指针需要在某个时候被释放。分配不正确,您应该为最后的'\0'分配额外的1个字节。您可以使用 strcpy 将字符串复制到分配的空间,或者简单地使用 strdup() 来执行这两项操作:

char *func2(void) {
const char *str[3] = { "so", "is", "amazing" };
int size = strlen(str[1]) + 1;
char *ret = malloc(size);
return strcpy(ret, str[1]);
}

或者简单地说:

char *func2(void) {
const char *str[3] = { "so", "is", "amazing" };
return strdup(str[1]);
}

永远不要使用strncpy,它不会按照您的想法去做。对于程序员和任何阅读您的代码的人来说,这都非常容易出错。

关于c - 从 C 函数中创建的数组返回数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259909/

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