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

如何将数组设置为等于char*方法的返回值,c,pointers,char,arrays,C,Pointers,Char,Arrays,假设我有一个char*方法,它返回一个char数组。如何将另一个字符数组设置为该返回值?例如,下面是char*方法: char* work(int num){ char buf[32]; sprintf(buf, "%d", num); return buf; } 我需要在main方法中放入什么来使用返回值?我试过了 int main() { char rValue[32] = work(5); } 但我得到一个错误:数组初始值设定项必须是初始值设定项列表或

假设我有一个char*方法,它返回一个char数组。如何将另一个字符数组设置为该返回值?例如,下面是char*方法:

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

    return buf;
}
我需要在main方法中放入什么来使用返回值?我试过了

int main() {
    char rValue[32] = work(5);
}
但我得到一个错误:数组初始值设定项必须是初始值设定项列表或字符串文本

给我错误:数组类型“char[32]”不可赋值


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

不能从函数返回数组。这是因为数组buf对于函数work是本地的。函数返回后,数组buf将超出作用域,然后访问它将调用未定义的行为

数组不是C中的一级对象,因为不能将数组传递给函数,也不能从函数返回数组。实际传递或返回的是指向数组第一个元素的指针。这也是因为数组衰减到指向其第一个元素的指针

您应该动态分配阵列,以便在释放分配的内存之前不会破坏阵列

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;
}
你的主要任务应该是

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

    printf("%s\n", p);
    free(p);
    return 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);
}

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

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;
}

有关和的详细信息,请参见。

您要做的是使用指针传递右值

我不完全确定您想要实现什么,但我下面的修改允许编译gcc没有错误

您所做的是将右值数组的第一个元素的地址传递到工作中。在指导处理原始数据时,不需要返回。这与某些语言通过引用传递时的情况类似

#include <stdio.h>

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

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

你真的需要调用malloc来返回32个字节吗?我看没有问题。对于这样一个简单的例子,声明一个全局变量更为常见,但是理解什么是steack和heap以及何时释放它是很重要的!看这里:@Matthias那将是最糟糕的。很多人不使用malloc就无法返回字节。@self请解释一下。有时全局变量不太好。请务必最后释放右值内存。在大多数情况下,程序结束时不需要这样做,就像在windows上一样。我同意,但释放内存始终被认为是一个很好的练习。如果代码块将来从main移动到另一个函数会怎么样。当您释放内存、关闭文件或释放互斥时,表明作者知道他在使用什么内存。我主张应该释放动态分配的内存。对于小项目或演示程序来说可能是好的,但对于大项目来说是危险的。在C语言中,不需要强制转换malloc/Calloc/realloc,也不建议以任何方式转换:漂亮、简单和优雅您还应该传递缓冲区的大小,以允许函数通过使用snprintf来检查这一点,并避免缓冲区溢出。因此,使函数返回一个int,以便能够告诉调用者它的结果将是下一个改进级别。感谢您的帮助!您的示例非常好,不幸的是,我不能偏离起始代码的设置方式。我发布的代码设置与初学者代码类似,我只是想把这个概念写下来。
#include <stdio.h>

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

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