这在C中是否适合做?
int* Eratosthenes = new int[num]
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()
是不必要的?
答案 0 :(得分:4)
在你的第一个函数中,返回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
,它不会按照您的想法执行。对于程序员和任何阅读代码的人来说,这都是非常容易出错的。
答案 1 :(得分:1)
这在C中是否适合做?
不,不是!你需要创建一个局部变量的副本,尽管在这种情况下,指针指向字符串文字,所以它可以工作。
您正在分配和复制字符串错误,您应该这样做
size_t size = strlen(str[1]) + 1;
char *result = malloc(size) ; // create a block of mem to hold the str[1].
if (result != NULL)
memcpy(ret, str[1], size);
答案 2 :(得分:0)
虽然可以返回指向字符串文字的指针,但不要使用本地指针,但这可能是错误的方法。
如果str
没有改变,请将其static const char * const str[] = ....
同时限定,数组和char []
(每个字符串文字)指向const。 static
使其成为永久性的,但仍具有局部范围。在程序代码启动之前设置一次。相反,非static
版本将为每次调用设置数组。
请注意,您必须返回const char *
以保持const正确性。
我强烈建议;如果你不能,只省略第一个const
。
注意:请勿投射malloc
&的结果C中的朋友(或void *
)。