簡體   English   中英

C malloc()中的內存分配

[英]Memory allocation in C malloc()

我對這段代碼的行為有點困惑,

#include <stdio.h>
#include <stdlib.h>

char* foo(){
   char* arr = (char*)malloc(sizeof(char)*100);
   return arr;
}

void foo1(char* myArr){
 char* arr = (char*)malloc(sizeof(char)*100);
 myArr = arr;
}

int main(){
  char* myArr;
  foo1(myArr);
  myArr[23] = 'a';
  printf("%c", myArr[23]);
  return (0);

}

當我調用myArr = foo() ,它工作得很好,分配的內存地址的值將分配給myArr並且我有一個沒有錯誤的分配的內存段。 另一方面,當我調用函數foo1(myArr)它必須將myArr傳遞給該函數,它是一個指向段的指針,因此此指針的任何更改都會影響內存段,(例如,如果我想交換兩個字符串值,我可以簡單地交換指針),但我會得到一個segmentation fault error ,為什么? 因為 myArr 在main函數中不是 myArr ? 真的嗎?!!

您將兩個不同的變量myArr ,這可能會讓您感到困惑。 更改myArrfoo1對沒有影響myArrmain僅僅是因為他們具有相同的名稱。 您將main myArr的值傳遞給foo1 ,但沒有返回任何內容。

void foo1(char* myArr){
 char* arr = (char*)malloc(sizeof(char)*100);
 myArr = arr;
}

這在概念上與:

void foo1(int j) {
    int q = 2;
    j = q;
}

正如foo1(3)不會以某種方式將3變成2foo1(myArr)也不會改變myArr的值。 myArr是一個指針並不會改變它的語義myArr是按值傳遞,句點。 所以只有myArr的值被傳遞給函數。

  char* myArr;
  foo1(myArr);

請注意, myArr未分配值,因此您向foo1傳遞了一個指向任何內容的指針的值。 foo1對這個值沒有任何用處。

你可能想要:

void foo1(char** myArrPtr){
 char* arr = (char*)malloc(sizeof(char)*100);
 *myArrPtr = arr;
}

 char* myArr;
 foo1(&myArr);

這樣一來,該函數得到一個指向myArr再修改的東西,指針指向,這是myArrmain

C 中的參數總是按值調用——參數獲取調用者傳遞的內容的副本並且是一個新變量,因此如果函數更改參數的值,它不會影響傳入的任何值。所以當你打電話

foo1(myArr);

myArr的值不會改變,即使 foo1 為其分配了不同的值。

暫無
暫無

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

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