2013-10-10 53 views
0

我正在處理任務並遇到具有挑戰性的問題。就我而言,從我所瞭解的情況來看,後面的代碼應該是正確的,但它不起作用。基本上我想要的是將一個字符串值複製到一個結構的變量成員中,該結構是作爲指針傳遞給方法的數組的一部分。我錯過了什麼?更改結構數組元素中的值

typedef struct 
{ 
    char * name; //variable in struct I am trying to access 
} Struct; 

void foo(Struct * arr) //array of Structs passed into function as a pointer 
{ 
    int i = 0; 
    while(i++ < 2)  
    { 
     arr[i].name = malloc(sizeof(char *)); //assigning memory to variable in each Struct 
     arr[i].name = strdup("name"); //copying "name" to variable in each Struct 
     printf("C - %s\n", arr[i].name); //printing out name variable in each Struct 
    } 
} 

main() 
{ 
    Struct * arr; //defining pointer 
    arr = calloc(2, sizeof(Struct)); //allocating memory so pointer can hold 2 Structs 
    foo(arr); //calling function foo passing pointer into function 
    return 0; 
} 

該代碼編譯並運行,但它不做它設計的目的。請原諒我,如果這是微不足道的。我是新來的C語言

+1

'typedef結構Struct'是一個非常,非常*,* ***非常糟糕想法*** – 2013-10-10 20:58:25

+0

我使用「結構」只是爲了使它在閱讀時明顯表明我正在使用指針作爲結構數組 – etienz

+0

1.數組的基本類型是不相關的。但是從聲明中可以看出,這是一小段代碼。 3.如果你想使它明確無誤,那麼不要typedef,並使用'struct Foo array [100];'中的'struct'關鍵字。不要造成混淆。請稍等。 – 2013-10-10 21:01:45

回答

2

兩個問題:

  1. while(i++ < 2)這條線,只要它會檢查它改變了i價值,讓您的循環體是不一樣的,因爲它進行了調查。
  2. arr[i].name = strdup("name");覆蓋.name指針的值,導致內存泄漏,您之前編輯的內存爲malloc()
-1

這不是直接回答你的問題,但解決的問題,以大投入評論...
其他問題:你可能不打算僅分配(字符*)的價值記憶到一個至少要保存「名字」的變量。更改;

arr[i].name = malloc(sizeof(char *));

到:

arr[i].name = malloc(sizeof(char)*strlen("name")+1); // + 1 '\ 0'

或更好,但使用char *name="name";,則:

arr[i].name = malloc(sizeof(char)*strlen(name)+1);

甚至更​​一般(和更好):

char *name; 

name = malloc(strlen(someInputString)+1); 
//do stuff with name... 
free(name); 

現在,您可以根據someInputString的長度分配name到任何需要的長度。

[編輯] Etienz,我想解決一兩件事,通過上述@ H2CO3提到,但沒有真正解釋,我認爲可能對你有用:
關於你渴望兩個結構體的空間,因爲你鍵入了你的結構體,你可以簡單地做這樣的事情:(但我會改變你使用的名字從Struct到NAME :) 整個觀點是,當一個結構被創建爲一個數組,你不需要使用calloc或malloc來爲它們創建空間,它的完成如下所示...

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

typedef struct{ 
    char *name; 
}NAME; 
//use new variable type NAME to create global variables: 
NAME n[2], *pN; //2 copies AND pointer created here 
//prototype func 
int func(NAME *a); 
int main() 
{ 
    pN = &n[0]; //pointer initialized here 
    func(pN); //pointer used here (no malloc or calloc) 
    printf("name1 is %s\nname 2 is %s", pN[0].name, pN[1].name); 
    return 0; 
} 

int func(NAME *a) 
{ 
    char namme1[]="andrew"; 
    char namme2[]="billebong"; 
    //You DO have to allocate the members though 
    a[0].name = malloc(strlen(namme1)+1); 
    a[1].name = malloc(strlen(namme2)+1); 

    strcpy(a[0].name, namme1); 
    strcpy(a[1].name, namme2); 
    return 0; 
} 
+1

sizeof(char)not sizeof(char *)。加1 –

+0

是的,重要的,錯過了。謝謝 – ryyker

+0

仍然需要終結者的+1。 –

1

2擴展指出正確不已,

arr[i].name = strdup("name"); 

即使您使用以下,而不是上面,

strcpy(array[i].name, "name"); 

你還沒有分配到足夠的字節存儲字符串即這是錯誤的

arr[i].name = malloc(sizeof(char *)); 
// even if pointer is 8 byte here, concept isn't right 

應該像

arr[i].name = malloc(strlen("name")+1); 
// or MAX_SIZE where it is greater than the possible "name". 

或者更好的是,在所有取出的malloc,需要的strdup分配照顧自己