【发布时间】:2016-02-07 22:25:32
【问题描述】:
这是在 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() 是不必要的?
【问题讨论】:
-
char * str[3] = { "so" , "is" ,"amazing" } ;被声明为在函数中,并在函数返回时不再存在。 (它是函数本地的,当函数返回时释放内存——因此str[1]指向的内存不再存在)您必须将str作为参数传递给函数,或者为str和mallocwithin 函数并返回一个指向新内存块的指针。 -
@DavidC.Rankin 是的,这也是我的想法,但是 C CPP 和那里的规则简直太疯狂了。看到这个stackoverflow.com/questions/349025/…
-
@DavidC.Rankin:
str数组本身具有自动存储功能,但它的元素是指向具有静态存储的字符串文字的指针。返回其中之一即可,指针按值返回。 -
@nnrales:恐怕 DavidC.Rankin 弄错了。您的示例很简单,如果您的实际代码使用指向字符串文字的指针数组,您可以从中返回元素。
-
如果
str没有改变,则改为static const char * const str[] = ...。这同时符合数组和指向const的char []。static使其永久化,其余使其在启动时初始化。您当前的版本将为每次调用设置数组。
标签: c arrays pointers scope malloc