C 将数组作为函数参数传递并设置元素值

C 将数组作为函数参数传递并设置元素值,c,arrays,pointers,C,Arrays,Pointers,所以我认为这个问题的解决方法相当简单,但我肯定遗漏了一些东西。我要做的就是将数组传递给函数,然后在函数中设置数组元素值,以便在全局范围中使用 int setArray(char* myArray) { char localArray[9] = "abcdefghi"; for (int i = 0; i < 10; i++){ myArray[i] = localArray[i]; printf("myArray: %c\n", myArray

所以我认为这个问题的解决方法相当简单,但我肯定遗漏了一些东西。我要做的就是将数组传递给函数,然后在函数中设置数组元素值,以便在全局范围中使用

int setArray(char* myArray) {
    char localArray[9] = "abcdefghi";

    for (int i = 0; i < 10; i++){
       myArray[i] = localArray[i];
       printf("myArray: %c\n", myArray[i]);
    }
    return(0);
};

int main(int argc, char* argv[])
{
    char* globalArray = NULL;

    setArray(globalArray);
    printf("globalArray: %s\n", globalArray);
    return(0);
};
上面的代码只是崩溃了。有一次我让它工作,我可以在函数中设置globalArray并打印出它的值,但当我在main中打印出值时,它是空的

我相信问题在于没有正确设置指针并传递它,但我不确定


任何帮助都将不胜感激。谢谢。

它崩溃了,因为您没有为globalArray分配内存

只需添加如下内容:

globalArray = malloc(10);
在setArray调用之前


另外,如前所述,复制函数不正确,因为复制时忘记了null终止符。

您需要为指向的globalArray分配内存,或者需要将其声明为数组而不是指针:

char *globalArray = malloc( SOME_SIZE );
if ( globalArray )
{
  setArray( globalArray ); 
  ...
}
free( globalArray );

其中某个_大小足够大,至少可以容纳setArray函数中localArray的内容加上一个尾随字符串终止符0值字节

编辑

代码崩溃的原因是为myArray参数传递了一个空值,这是一个无效的指针值。在这种情况下,试图通过使用[]下标运算符取消引用无效指针值会导致未定义的行为;在您的情况下,它会导致代码崩溃

指针globalArray未指向有效的内存位置。您需要使用malloc、calloc等在globalArray中分配内存并存储该地址

您可以在main或setArray函数中分配内存,因为动态内存分配使用堆,即使在setArray退出后,所有函数都可以访问堆

所以正确的代码可能是:

char* globalArray = malloc(10 * sizeof(char));
if(!globalArray)
{
    printf("Memory could not be allocated!\n");
    exit(1);
}

setArray(globalArray);
...  
您还没有在函数setArray中将\0字节复制到myArray

在for循环之后,需要myArray[i]='\0'

还有char localArray[9]=abcdefghi;在你的代码中

此处localArray不是有效的c字符串,因为它不包含终止字符“\0”。虽然目前还没有任何问题,但如果您碰巧将localArray打印/更改为字符串,则会导致无效的内存访问错误

所以为了避免这种使用

`char localArray[] = "abcdefghi";` 
而不是

`char localArray[9] = "abcdefghi";`

不能将数组传递给C中的函数。return是语句,而不是函数。不要使用括号。localArray只有9个元素,但是如果复制10个元素,调用未定义的行为。记住这个名称,您将更频繁地调用它。指针不被称为数组是有充分理由的,反之亦然!sizeofchar是一个定义。@AndrewHenle是的,谢谢,编辑了我的答案。但您不认为在本例中使用sizeofchar会使代码更具描述性吗?还是只是多余的代码?谢谢@rootkea。我很感激大家的输入所有提到的其他东西在我这方面都是愚蠢的错误,但是我不理解我试图实现的概念,尽管上面没有显示,但是在函数中分配内存将不起作用。我不明白为什么会发生这种情况,因为当我在函数中打印数组时,它是正确的,但一旦我在函数退出时打印它,它就为null。这就是让我困惑的地方。我想底线是,没有办法在函数中分配内存,然后在主函数中使用它?你不能访问函数的局部变量静态内存分配一个函数作为局部变量退出,例如int a use stack,但你可以访问动态分配的内存,即使在函数作为动态退出之后内存分配使用全局可访问的堆。
`char localArray[9] = "abcdefghi";`