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

时间:2016-02-07 22:25:32

标签: c arrays pointers scope malloc

这在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()是不必要的?

3 个答案:

答案 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)

  1.   

    这在C中是否适合做?

    不,不是!你需要创建一个局部变量的副本,尽管在这种情况下,指针指向字符串文字,所以它可以工作。

  2. 您正在分配和复制字符串错误,您应该这样做

    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 *)。