2012-10-20 59 views
1

Possible Duplicate:
What is the difference between char s[] and char *s in C?
Difference between char *str = 「…」 and char str[N] = 「…」?字符串在結構用C

我有一個結構定義爲:

typedef struct 
{ 
    bool     configured; 
    bool     active; 
    uint32    lastComms; 
    uint32    rxChRvdTime; 
    char     *name; 
}vehicle; 

,我初始化如下:

static vehicle *myVehicle; 

當我要初始化的名字,我用途:

myVehicle->name = "helloworld"; 

這工作正常。但是當我不想將它設置爲字符串字面以外的東西時,我似乎遇到了問題。

char *tmpName = "foobar"; 
strcpy(myVehicle->name, tmpName); 

那麼爲什麼不strcpy工作?我是否需要事先在結構中預先分配結構中的字符串大小?我不應該使用'姓名'字段的指針,因爲只能有一輛車?

+0

__「我是否需要事先在結構中預先分配結構中的字符串大小?」__ – oldrinb

+0

ok,noob問題:爲什麼不簡單地執行'myVehicle-> name = tmpName;' – Prasanth

+0

我不同意。這個問題是關於在結構體內爲字符串分配內存的。我讀了這個問題,但並沒有解決我的問題。 – Jonathan

回答

2

您需要分配內存複製到:

myVehicle->name = malloc(strlen(tmpName) + 1); 
if (myVehicle->name) 
{ 
    strcpy(myVehicle->name, tmpName); 
} 

myVehicle->name是一個未初始化的char*。如果您malloc()您需要free()。字符串文字的賦值工作原理是因爲您將name指向字符串文字的地址,該文字在程序的整個生命週期中都存在。

但在這之前,你需要爲myVehicle分配內存本身:

myVehicle = malloc(sizeof(*myVehicle)); 

或只是讓myVehicle的對象,而不是一個指針:

static vehicle myVehicle; 
+0

當爲myVehicle或名稱分配內存時,出現編譯器錯誤:「類型爲」int「的值不能分配給類型爲」vehicle *「的實體」 – Jonathan

+0

@ shred444,您需要'#include ' – hmjd

+0

hmjd,你是個怪物。謝謝哥們! – Jonathan

0

你想

myVehicle->name = strdup("foobar"); 

,但稍後請勿忘記free。實際上,你通常不需要strdup常量字符串(但是如果這個字符串可能會被覆蓋,那麼你需要這樣做,因爲常量字符串通常停留在只讀段中,並且寫入它們是未定義的行爲。 )。您可能會在某個緩衝區中創建一個字符串,並且該緩衝區爲strdup。更現實的例子可能是:

char buf[32]; 
static int counter; 
counter++; 
snprintf(buf, sizeof(buf), "#%d", counter); 
myVehicle->name = strdup(buf); 
+0

爲什麼downvote? –

+0

不,想法。所以+1再次平衡。 –

0

你只聲明瞭一個指針,而不是它指向的實際內存。嘗試:

char *tmpName = "foobar"; 
myVehicle->name = malloc(strlen(tmpName) + 1); 
if (myVehicle->name) 
    strcpy(myVehicle->name, tmpName); 
else 
{ 
    // error 
} 

不要忘記釋放myVehicle->name一旦你用它做。

+0

哇。我發佈後32秒?謝謝!所以當包含這個函數完成時,代碼不會自動清除聲明的tmpName空間?它是如何知道我會在以後繼續使用它? – Jonathan

+1

它不會被清除,因爲你稱爲malloc,並且malloc的內存是持久的,直到你明確釋放它('free(myVehicle-> name)')。如果在釋放緩衝區之前丟失了指針,則沒有人會爲您清理它,並且會發生內存泄漏。 – MByD