如何设置一个等于char *方法返回值的数组

时间:2014-05-08 16:35:15

标签: c pointers char arrays

假设我有一个返回char数组的char *方法。模具如何设置另一个char数组等于返回值?例如,这是char *方法:

char* work(int num){
    char buf[32];
    sprintf(buf, "%d", num);

    return buf;
}

我需要在main方法中使用返回值?我试过了

int main() {
    char rValue[32] = work(5);
}

但我得到“错误:数组初始值设定项必须是初始化列表或字符串文字”

int main() {
    char rValue[32];
    rValue = work(5);
}

给我“错误:数组类型'char [32]'不可分配”。

我知道解决方案可能非常简单,但我迷失了。我如何访问返回的值?

4 个答案:

答案 0 :(得分:4)

您要做的是使用指针传递rValue

我不完全确定你想要达到的目标,但我在下面的修改允许编译而没有错误的gcc。

您正在做的是将rValue数组的第一个元素的地址传递给工作。由于您正在指导处理原始数据,因此无需返回。这类似于某些语言在通过引用"

传递时的含义
#include <stdio.h>

void work(int num, char *rValue) {
    sprintf(rValue, "%d", num);
}

int main() {
    char rValue[32];
    work(5, rValue);
}

答案 1 :(得分:1)

您无法从函数返回数组。这是因为数组buf是函数work的本地。函数返回后,数组buf超出范围,之后访问它会调用未定义的行为。

C中,数组不是第一类对象,因为您无法将数组传递给函数或无法从函数返回数组。实际传递或返回的是指向数组的第一个元素的指针。这也称为the array decays to a pointer to its first element

您应该动态分配数组,以便在分配内存free之前不会销毁它。

char *work(int num) {
    char *buf = malloc(32);

    // check the result of malloc
    // in case it fails
    if(buf == NULL) {
        printf("malloc failed to allocate memory\n");
        return NULL;
    } 

    // make sure that buff is large enough 
    // to contain num else sprint will overrun
    // buf causing undefined behaviour
    sprintf(buf, "%d", num);

    return buf;
}

您的main应该是

int main(void) {
    char *p = work(5);
    if(p == NULL)
        return 1;

    printf("%s\n", p);
    free(p);
    return 0;
}

答案 2 :(得分:1)

首先,您无法返回类似的本地数组。它将超出范围,值可能变为垃圾。您需要做的是先动态分配它。一旦你这样做,你就可以安全地归还它。

char* work(int num){
    char *buf = malloc(sizeof(char)*32);
    sprintf(buf, "%d", num);

    return buf;
}

现在,要接收指针,您需要另一个指针变量。不是数组。

int main() {
    char *rValue = work(5);
}

最后,您需要释放已分配的内存,以便将来可以使用。

int main() {
    char *rValue = work(5);
    free(rValue);
    return 0;
}

详细了解mallocfree

答案 3 :(得分:0)

char buf [32];是一个局部变量。函数执行后,它的内存将被释放。您应该使用malloc将堆中的内存分配给char指针。您可以使用memcopy复制数组。如果你想用char *而不是char(指针)将一个数组复制到另一个数组。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>  
char* work(int num){
    char *r = (char*)malloc(sizeof(char)*32);
    sprintf(r, "%d", num);
    return r;
}

int main() {
    char *rValue = NULL;
    rValue = work(5);
}