c语言 - 为什么我会"array initializer must be an initializer list or string literal"?



我是C编程的新手,并且在C是Java之前使用的语言。我正在尝试获取一种返回字符阵列的方法,但它不起作用。这是我的语法:

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,并对值进行某种计算,然后返回一个全新的单个数组。我是一个完整的初学者,在网上找不到其他帮助。我在做什么错?

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

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

然后您无法定义空数组。阵列必须具有大小。并且使用main功能中的数组newArr无论如何都是错误的,因为您调用的函数返回 pointer 。因此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);

相关内容

最新更新