[英]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
,這可能會讓您感到困惑。 更改myArr
在foo1
對沒有影響myArr
在main
僅僅是因為他們具有相同的名稱。 您將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
變成2
, foo1(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
再修改的東西,指針指向,這是myArr
在main
。
C 中的參數總是按值調用——參數獲取調用者傳遞的內容的副本並且是一個新變量,因此如果函數更改參數的值,它不會影響傳入的任何值。所以當你打電話
foo1(myArr);
myArr
的值不會改變,即使 foo1 為其分配了不同的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.