簡體   English   中英

將數組作為函數參數傳遞並設置元素值

[英]Passing Array as a function argument and setting elements values

因此,我認為該問題的解決方案非常簡單,但我必須缺少一些東西。 我要做的就是將數組傳遞給函數,然后在函數中設置數組元素值,然后在全局范圍內使用。

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。

我認為問題在於無法正確設置指針並傳遞它,但是我不確定

任何幫助將不勝感激。 謝謝。

它崩潰是因為您沒有為globalArray分配內存。

只需添加如下內容:

globalArray = malloc(10);

setArray()調用之前。

另外,如前所述,您的復制功能不正確,因為您在復制時忘記了空終止符。

指針globalArray沒有指向有效的內存位置。 您需要分配內存,並使用malloccalloc等將該地址存儲在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循環之后for您需要myArray[i] = '\\0';


你也有char localArray[9] = "abcdefghi"; 在您的代碼中。

這里的localArray不是有效的c字符串,因為它不包含結尾的'\\0'字符。 盡管它暫時不會出現任何問題,但是如果您碰巧將localArray打印/更改為字符串,那么它將導致無效的內存訪問( SegFault

所以避免使用

`char localArray[] = "abcdefghi";` 

代替

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

您需要為globalArray指向分配內存,或者需要將其聲明為數組而不是指針:

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

要么

char globalArray[SOME_SIZE];
setArray( globalArray );

其中SOME_SIZE大到足以至少將setArray函數中localArray的內容以及尾隨字符串終止符(0值字節)保存起來。

編輯

代碼崩潰的原因是您為myArray參數傳遞了一個NULL值,這是一個無效的指針值。 嘗試取消引用無效的指針值(在這種情況下,通過使用[]下標運算符)會導致未定義的行為 在您的情況下,它將導致您的代碼崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM