2013-02-19 178 views
0

如何從一個結構體賦值給另一個結構體。這是我的代碼。用另一個結構體初始化一個結構體

我相信我分配的是我不想做的結構地址。我想將「temp」的值賦給「a」。我評論了我需要幫助的部分。謝謝

也偏離主題..我怎麼張貼代碼,而不必縮進我自己的每一行,一行一行?

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

#define SIZE 10 

typedef struct dynArrStruct 
{ 
    double value1; 
    int value2; 
    int value3; 
}dynArr; 


void init(dynArr* a) 
{ 
    dynArr temp; 
    temp.value1 = (double)(rand()) * rand()/rand(); 
    temp.value2 = rand()%100; 
    temp.value3 = rand()%1000; 
    printf("In init(): value1: %14.5f, value2: %6d, value3: %6d\n", 
      temp.value1, temp.value2, temp.value3); 
    a = &temp; // THIS LINE 
} 


int main(int argc, char** argv) 
{ 
    int i; 
    dynArr a1[SIZE]; 
    dynArr* a2[SIZE]; 

    for(i = 0; i < SIZE; i++) 
    { 
     init(&(a1[i])); 
     init(a2[i]); 
    } 
    return 0; 
} 
+2

選擇所有使用鼠標的代碼行,然後按Ctrl + K – 2013-02-19 15:09:29

+0

memcpy()也許? – m0skit0 2013-02-19 15:10:05

+0

如果您複製到尚未初始化的指針,您的代碼中可能存在未定義的行爲,就像'a2'數組的情況一樣。 – 2013-02-19 15:13:20

回答

3

使用賦值(假設a指向有效的內存):

*a = temp; 

注意這個工作,因爲該struct的成員不是指針。在包含成員指針的struct上使用此技術(或memcpy())將導致兩個成員都指向相同的地址,這可能很危險(可能導致懸掛指針)。如果struct包含指針,則需要struct的深層副本(爲成員指針分配內存,並將指向源結構中的對象的內容複製到目標struct中的已分配內存)。

此外,在這種情況下temp是多餘的,您只需將值直接分配給a的成員。

+0

這是我需要的修復程序。謝謝。現在a2是seg錯誤,甚至不存儲 – juice 2013-02-19 15:30:28

1
void init(dynArr* a) 
{ 
    dynArr temp; 
    temp.value1 = (double)(rand()) * rand()/rand(); 
    temp.value2 = rand()%100; 
    temp.value3 = rand()%1000; 
    printf("In init(): value1: %14.5f, value2: %6d, value3: %6d\n", 
      temp.value1, temp.value2, temp.value3); 
    a = &temp; // THIS LINE 
} 

temp是一個具有自動存儲持續時間的本地變量。當init返回時,它不復存在。

幸運的是,指向a的指向temp也停止存在,所以init不會爲您的程序創建懸掛指針。

struct s爲可分配的,所以如果該參數指向一個有效的內存,你可以初始化指針對象與

*a = temp; 

這將爲

init(&(a1[i])); 

是好的,因爲&a1[i]指向分配的內存,但不適用於

init(a2[i]); 

因爲a2[i]是未初始化的指針。

如果你想分配init的內存,你必須通過dynArr**,但是你不能在第一種情況下使用它。因此,在撥打init之前,您應該爲a2[i]分配內存。