假设我有一个返回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]'不可分配”。
我知道解决方案可能非常简单,但我迷失了。我如何访问返回的值?
答案 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;
}
答案 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);
}