为什么我收到“数组初始值设定项必须是初始值设定项列表或字符串文字”?

12 c arrays

我对 C 编程完全陌生,在 C 之前我使用的语言是 Java。我正在尝试获取一种返回 char 数组的方法,但它不起作用。这是我的语法:

char * insertToArray(char * val){
    int k;
    char arr[2] = val;
    // do some other staffs here to the value
    return arr;
}

int main(){
    char s1[] = {"one", "two"};
    char newArr[];
    int i;

    for(i = 0; i < 2; i++){
        newArr[] = insertToArray(s1[i]);
    } 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想做的就是将s1数组传递给insertToArray并对值进行某种计算,然后返回一个全新的单个数组。我是一个完全的初学者,我在网上找不到任何其他帮助。我究竟做错了什么?

Som*_*ude 7

C 的规则规定不能使用指针初始化数组。相反,定义数组然后复制到其中:

char arr[strlen(val) + 1];  // Make sure there's enough space
strcpy(arr, val);
Run Code Online (Sandbox Code Playgroud)

那么就不能定义空数组。数组必须有一个大小。newArr无论如何,在函数中使用数组main都是错误的,因为您调用的函数返回一个指针。所以newArr也必须是一个指针。


现在,解决了这个问题,您的(当前)代码中还有一些非常错误的地方。

第一个是数组的大小arr。两个字符的数组只能容纳一个字符的字符串。请记住,字符串以空字符结尾,必须有空间容纳完整字符串加上终止符。

第二个问题是您返回一个指向局部变量的指针。一旦函数insertToArray返回,它的所有局部变量就不再存在。使用指向这些变量之一的指针将导致未定义的行为。

第一个问题的修复如上所示。第二个问题的修复有点困难,涉及向函数传递额外的参数或动态分配内存。我推荐额外的参数方式:

char * insertToArray(const char * val, char * arr){
    strcpy(val, arr);

    // do some other staffs here to the value

    return arr;
}
Run Code Online (Sandbox Code Playgroud)

然后称呼它为

char newArr[strlen(s1[i]) + 1];
insertToArray(s1[i], newArr);
Run Code Online (Sandbox Code Playgroud)