第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

動(dòng)態(tài)內(nèi)存訪問(wèn)僅在函數(shù)內(nèi)部工作。

動(dòng)態(tài)內(nèi)存訪問(wèn)僅在函數(shù)內(nèi)部工作。

C
慕的地6264312 2019-06-15 18:14:05
動(dòng)態(tài)內(nèi)存訪問(wèn)僅在函數(shù)內(nèi)部工作。此問(wèn)題用于此常見(jiàn)問(wèn)題的標(biāo)準(zhǔn)復(fù)制:我在一個(gè)函數(shù)中動(dòng)態(tài)地分配數(shù)據(jù),所有事情都運(yùn)行良好,但只在分配發(fā)生的函數(shù)中。當(dāng)我試圖在函數(shù)之外使用相同的數(shù)據(jù)時(shí),會(huì)出現(xiàn)崩潰或其他意外的程序行為。這里有一個(gè)MCVE:#include <stdlib.h>#include <stdio.h>void create_array (int* data, int size){   data = malloc(sizeof(*data) * size);   for(int i=0; i<size; i++)   {     data[i] = i;   }   print_array(data, size);}void print_array (int* data, int size){   for(int i=0; i<size; i++)   {     printf("%d ", data[i]);   }   printf("\n");}int main (void){   int* data;   const int size = 5;   create_array(data, size);   print_array(data, size);  // crash here   free(data);}什么時(shí)候都行print_array從內(nèi)部調(diào)用create_array函數(shù),我得到了預(yù)期的輸出。0 1 2 3 4,但當(dāng)我從main我的程序崩潰了。原因是什么?
查看完整描述

1 回答

?
莫回?zé)o

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

這個(gè)錯(cuò)誤的原因是datacreate_array函數(shù)是只存在于該函數(shù)中的局部變量。從malloc僅存儲(chǔ)在此局部變量中,從未返回給調(diào)用方。


考慮這個(gè)簡(jiǎn)單的例子:

void func (int x){
  x = 1;
  printf("%d", x);}...int a;func(a);printf("%d", a); // bad, undefined behavior - the program might crash or print garbage

在這里,一個(gè)復(fù)制變量的a作為參數(shù)存儲(chǔ)在函數(shù)中。x..這被稱(chēng)為按值傳遞.

什么時(shí)候x被修改,只更改局部變量。變量a在調(diào)用方中保持不變,并且由于a如果沒(méi)有初始化,它將包含“垃圾”,并且無(wú)法可靠地使用。


指針也不例外這個(gè)按值傳遞的規(guī)則。在您的示例中,指針變量data按值傳遞給函數(shù)。這個(gè)data函數(shù)內(nèi)的指針是一個(gè)本地副本,并從malloc永遠(yuǎn)不會(huì)被傳回給打電話的人。

因此調(diào)用方中的指針變量仍未初始化,因此程序崩潰。此外,create_array函數(shù)還創(chuàng)建了一個(gè)內(nèi)存泄漏,因?yàn)樵诤瘮?shù)執(zhí)行之后,程序中不再有任何指針來(lái)跟蹤分配的內(nèi)存塊。


有兩種方法可以修改函數(shù)以按預(yù)期工作。通過(guò)將局部變量的副本返回給調(diào)用方:

int* create_array (int size){
  int* data = malloc(sizeof(*data) * size);
  for(int i=0; i<size; i++)
  {
    data[i] = i;
  }

  print_array(data, size);

  return data;}int main (void){
  int* data;
  const int size = 5;

  data = create_array(size);
  print_array(data, size);}

或者將地址傳遞給調(diào)用者的指針變量并直接寫(xiě)入調(diào)用者變量:

void create_array (int** data, int size){
  int* tmp = malloc(sizeof(*tmp) * size);
  for(int i=0; i<size; i++)
  {
    tmp[i] = i;
  }

  *data = tmp;      
  print_array(*data, size);}int main (void){
  int* data;
  const int size = 5;

  create_array(&data, size);
  print_array(data, size);}

兩種形式都行。


查看完整回答
反對(duì) 回復(fù) 2019-06-15
  • 1 回答
  • 0 關(guān)注
  • 331 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)