2012-10-20 60 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