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

时间:2016-01-08 17:40:37

标签: 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[i]);
    }
    return(0);
};

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

    setArray(globalArray);
    printf("globalArray: %s\n", globalArray);
    return(0);
};

上面的代码崩溃了。有一次,我让它工作,我可以在函数中设置globalArray并打印出它的值但是当我打印出main()中的值时,它是null。

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

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

3 个答案:

答案 0 :(得分:1)

崩溃是因为你没有为globalArray分配内存。

只需添加以下内容:

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

此外,正如已经提到的那样,您的复制功能不正确,因为您在复制时忘记了空终止符。

答案 1 :(得分:1)

指针checkbox_value没有指向有效的内存位置。您需要使用globalArrayglobalArray等分配内存并在malloc中存储该地址。

您可以在callocmain()函数中分配内存,因为动态内存分配使用的堆即使在setArray()退出后也可以访问所有函数。

所以正确的代码可能是:

setArray

此外,您尚未在功能char* globalArray = malloc(10 * sizeof(char)); if(!globalArray) { printf("Memory could not be allocated!\n"); exit(1); } setArray(globalArray); ... 中将\0字节复制到myArray

setArray()循环后,您需要for

您的代码中也有myArray[i] = '\0';

此处char localArray[9] = "abcdefghi";不是有效的c字符串,因为它不包含终止localArray字符。虽然它暂时没有解决任何问题,但如果您碰巧打印/更改'\0'字符串,那么它将导致无效的内存访问(localArray

所以要避免使用

SegFault

而不是

`char localArray[] = "abcdefghi";` 

答案 2 :(得分:0)

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

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

char globalArray[SOME_SIZE];
setArray( globalArray );

其中SOME_SIZE足够大,至少可以保存localArray函数中setArray的内容加上一个尾随字符串终止符(0值字节)。

修改

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