2012-01-24 242 views
1

我真的很難得到這段代碼的工作。我試圖通過引用傳遞一個數組,以便在該函數中對其進行修改。然後我需要將這些修改回傳給原來的呼叫者功能。傳遞數組參考函數C

我在這裏搜索了類似的問題,但找不到任何可以像我想要做的方式成功運行。

這是我的代碼,我非常感謝任何幫助。非常感謝:

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

#define SIZE_OF_VALUES 5 
#define SIZE_OF_STRING 100 

void set_values(char **values); 

void set_values(char **values) 
{ 
    *values = malloc(sizeof(char)*SIZE_OF_VALUES); 
    for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) { 
     values[i] = malloc(sizeof(char)*SIZE_OF_STRING); 
     values[i] = "Hello"; 
     //puts(values[i]); //It works fine here. 
    } 
} 

int main (int argc, const char * argv[]) 
{ 
    char *values; 
    set_values(&values); 

    for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) { 
     puts(values[i]); //It does not work! 
    } 

    return 0; 
} 
+0

你正在嘗試創建一個數組數組,所以「values」應該是一個指針指針(char **值)。 –

+0

感謝您的回覆,我已更改爲(char **值)並刪除了(&)引用,但代碼仍然不起作用 –

回答

3

有幾個問題與您的代碼:

  1. 你應該有三個層次的三分球 - void set_values(char ***values),讀它作爲「參考(第一*)至char*數組(第二*)(第三*)」

  2. *values每個元素應該是一個指針(char*)不char,所以你需要:

    *values = malloc(sizeof(char*)*SIZE_OF_VALUES); 
    
  3. 您正在泄漏內存,第一mallocing然後分配文字,另外不提領values,你需要或者:

    (*values)[i] = "Hello"; 
    

    (*values)[i] = strdup("Hello"); // you will have to free it later 
    

    (*values)[i] = malloc(sizeof(char)*SIZE_OF_STRING); // you will have to free this as well 
    strcpy((*values)[i], "Hello"); 
    
  4. 在您的main,您應該聲明char **values;,因爲它是指向char*(字符串/數組)的數組的指針。

  5. 在你循環中,你錯誤地將索引乘以sizeof,索引被計算在不是以字節爲單位的元素中。因此,您需要:

    for (int i = 0; i < SIZE_OF_VALUES; i++) 
    
  6. 不要忘記在最後釋放內存。

+0

哇,非常感謝您的快速回復和對問題的出色解釋。我接受了你的答案。非常感謝你! –

0

使用char ***類型,請您set_values函數的參數:

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

#define SIZE_OF_VALUES 5 

void set_values(char ***values) 
{ 
    *values = malloc(sizeof (char *) * SIZE_OF_VALUES); 
    for (int i = 0; i < SIZE_OF_VALUES; i++) { 
     (*values)[i] = "Hello"; 
    } 
} 

int main (int argc, char *argv[]) 
{ 
    char **values; 
    set_values(&values); 

    for (int i = 0; i < SIZE_OF_VALUES; i++) { 
     puts(values[i]); 
    } 

    return 0; 
} 

當然,你必須檢查malloc返回值的主要出口之前free分配的內存。

-3

你在這一行額外*

*values = malloc(sizeof(char)*SIZE_OF_VALUES); 

這應該是:

values = malloc(sizeof(char)*SIZE_OF_VALUES); 

你也有在主相當大的問題,char* valueschar** values,通過你的char* values引用(set_values(&values);)可能會導致我懷疑的分段錯誤。

對於影響外陣列,它已經受到影響傳遞給函數時,因爲您只複製指向同一個地方一個指針,以便修改將影響相同的內存塊。

+1

僅通過引用傳遞僅在C++中受支持。由於問題標記爲「C」,因此他需要三個級別的指針。 –

0

char *是char的一維數組。但是你想讓你的代碼在set_values中將值設置爲二維數組。 爲了使這項工作,定義:

char **values;

函數set_values爲void set_values(char ***values)

分配指針爲字符數組爲: *values = malloc(sizeof(char*)*SIZE_OF_VALUES);

除此之外你的循環是有點奇怪:

for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) { 

for (int i = 0; i < SIZE_OF_VALUES; i++) { 

,最終被替換,如果要複製一個字符串到你現在分配的數組總共使用

strncpy((*values)[i], "Hello", SIZE_OF_STRING-1); 
(*values)[i][SIZE_OF_STRING-1] = '\0'; 

這樣:

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


#define SIZE_OF_VALUES 5 
#define SIZE_OF_STRING 100 

void set_values(char ***values); 

void set_values(char ***values) 
{ 
    const char * content = "Hello"; 
    *values = malloc(sizeof(char*)*SIZE_OF_VALUES); 
    for (int i = 0; i < SIZE_OF_VALUES; i++) { 
     (*values)[i] = malloc(sizeof(char)*SIZE_OF_STRING); 
     strncpy((*values)[i], content, SIZE_OF_STRING-1); 
     (*values)[i][SIZE_OF_STRING-1] = '\0'; 
     if(strlen(content) >= SIZE_OF_STRING){ 
      fprintf(stderr,"Warning content string did not fit into buffer!\n"); 
     } 
    } 
} 

int main (int argc, const char * argv[]) 
{ 
    char **values; 
    set_values(&values); 

    for (int i = 0; i < SIZE_OF_VALUES; i++) { 
     printf("%s\n", values[i]); 
    } 

    for (int i = 0; i < SIZE_OF_VALUES; i++) { 
     free(values[i]); 
    } 
    free(values); 

    return 0; 
} 
0

下面是解。

void set_values(char ***values) 
{ 
    int i; 
    char ** val; 

    val = *values = (char**)malloc(sizeof(char*)*SIZE_OF_VALUES); 
    for (i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) 
     val[i] = "Hello"; 
} 

int main (int argc, const char * argv[]) 
{ 
    char **values; 
    int i; 
    set_values(&values); 

    for (i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) 
     puts(values[i]); 

    return 0; 
} 
+1

只需發佈固定代碼教OP什麼都沒有。對我而言,這是毫無價值的答案。 – Krizz