簡體   English   中英

C-將數組傳遞給函數並在函數內部重新分配

[英]C - pass array to function and realloc inside the function

我需要創建一個動態數組,然后由函數填充。 我無法提前知道該數組的大小。 所以我做了以下事情:

TAB_TYPE *column_types = malloc(100*sizeof(TAB_TYPE));
hExtract = make_table_definition(jsstr, tokens, column_types);

我隨機決定分配100個元素。 在函數內部,我使用以下命令調整了大小:

realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE)))

使用GCC編譯時,上面的代碼行產生了以下錯誤:

error: ignoring return value of ‘realloc’, declared with attribute warn_unused_result  

我設法通過這樣的:

if (!(int *) realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE)))
    log_die("Failed to allocate memory to column_types!");

log_die存在,並且有消息發送到stderr。

我還嘗試了以下方法,這會產生分段錯誤:

 //first declare a NULL pointer:
 TAB_TYPE *column_types = NULL; 

 //inside the function
TAB_TYPE *t = realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE));
if (!t){
    log_die("Failed to allocate memory to column_types!");
}else{
    column_types = t ;
}

// outside the function
for (int i=0; i < tokens[0].size / 2; i++ )
    printf("Type %d : %d\n", i, column_types[i]); -> SEGMENTATION FAULT!!!

我的問題是兩個:

  1. 這是這樣做的方法嗎?
  2. 為什么第二種方法以分段錯誤結束?

重新分配時,您將再次創建內存。 您需要將該內存重新分配給指針。 但是,當您將指針傳遞給函數時,可以更改該指針指向的值,但不能更改指針本身。 為此,您有2個選擇

  1. 返回重新分配的指針並將其分配給初始指針
  2. 將您的指針作為指針傳遞給指針。

這更好地解釋了

如何修改已傳遞到C函數中的指針?

第一點:

C使用pass-by-value傳遞來傳遞函數參數。 要從其他函數更改column_types的內存分配,您需要將指針傳遞column types

要澄清的是,如果在分配內存后將column_types傳遞給其他函數,則可以更改該內存位置[ *column_types ]指向的 ,而不是指針[ column_types ]本身。

第2點:

TAB_TYPE *t = realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE));

realloc()將調整column_types的現有內存大小,並返回指向新分配的內存的指針,該指針在t收集,並將free()現有的內存分配。 您應該從函數返回t並將返回值分配給TAB_TYPE指針。

realloc()手冊頁

void *realloc(void *ptr, size_t size);

realloc()函數返回指向新分配的內存的指針,該指針針對任何類型的變量都適當對齊,並且可能與ptr不同,

暫無
暫無

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

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