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

时间:2017-06-04 16:14:43

标签: c arrays

我是C编程的新手,也是我在C之前使用的语言。我试图获得一个方法来返回一个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;
}

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

1 个答案:

答案 0 :(得分:2)

C的规则说你不能使用指针初始化数组。而是定义数组然后复制到它:

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

然后你无法定义空数组。数组必须具有大小。无论如何,使用newArr函数中的数组main是错误的,因为您调用的函数返回指针。所以newArr也必须是一个指针。

现在,在你的(当前)代码中还有其他一些非常错误的东西。

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

第二个问题是你返回一个指向局部变量的指针。函数insertToArray返回后,其所有局部变量都不复存在。当您使用它时,指向其中一个变量将导致未定义的行为

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

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

    // do some other staffs here to the value

    return arr;
}

然后将其称为

char newArr[strlen(s1[i]) + 1];
insertToArray(s1[i], newArr);