请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

動態記憶體初始化方法問題

老師,我發現要初始化動態記憶體,可以直接這樣初始化 也不會發生影片中的報錯,是為什麼呢?
我的開發環境是Win10 VSCode+minGW(32bits),實際代碼如下:

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

//大陸地區
//stack —>棧
//heap —>堆

void InitPointer(int *ptr,int len,int default_value){ //動態記憶體的指標,動態記憶體長度,初始值
for(int i=0;i<len;i++){
ptr[i]=default_value;
}
}

int main(){
//動態記憶體分配(動態陣列)—>會配置在heap(堆)區—>不會被銷毀—>程序員自行管理
//使用malloc(size_t)方法配置 動態型記憶體(生命週期開始)
int num;
scanf("%d",&num);
//配置num個int大小的動態記憶體(以指標型態呈現)
int *players=malloc(sizeof(int)*num);
//malloc配置的動態記憶體是不會被初始化的,要自己做初始化
InitPointer(players,num,0);

//賦值
// for(int i=0;i<num;i++){
//     players[i]=i+1;
// }

//驗證
for(int j=0;j<num;j++){
    printf("%d ",players[j]);
}
//使用free(指標)--->釋放記憶體(生命週期結束)
free(players);
return 0;

}

執行結果:
图片描述

正在回答

2回答

你是说initpointer的参数是直接用指针而不是指针的指针是吧。你要注意我是在函数InitPointer内部调用的 malloc,而你在是外部调用的,这里会有差异。

0 回复 有任何疑惑可以回复我~
  • 提问者 阿寶1118 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-01-02 10:59:19
提问者 阿寶1118 2021-01-01 21:13:46

補充發問:

我這樣的寫法在函式中的ptr是main中的player還是其實已經複製一份了呢?

0 回复 有任何疑惑可以回复我~
  • 对的,复制了一份。
    回复 有任何疑惑可以回复我~ 2021-01-01 23:18:58
  • 提问者 阿寶1118 回复 bennyhuo #2
    所以說,因為複製同一份指標,所以指向的記憶體位置是相同的,才導致我的函式的賦值(初始化)是成功的。
    請問老師這樣的想法是正確的嗎?
    回复 有任何疑惑可以回复我~ 2021-01-02 11:01:23
  • bennyhuo 回复 提问者 阿寶1118 #3
    对的~
    回复 有任何疑惑可以回复我~ 2021-01-02 20:29:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信