C语言中结构中的字符串

C语言中结构中的字符串,c,string,pointers,struct,C,String,Pointers,Struct,可能重复: 我的结构定义为: typedef struct { bool configured; bool active; uint32 lastComms; uint32 rxChRvdTime; char *name; }vehicle; 我将其初始化如下: static vehicle *myVehicl

可能重复:

我的结构定义为:

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不起作用呢?我是否需要事先在结构中预先分配字符串大小?我是否应该在“名称”字段中使用指针,因为只能有一辆车?

您需要分配内存以复制到:

 myVehicle->name = malloc(strlen(tmpName) + 1);
 if (myVehicle->name)
 {
     strcpy(myVehicle->name, tmpName);
 }
as
myVehicle->name
是一个未初始化的
char*
。如果你
malloc()
你需要
free()
。对字符串文本的赋值之所以有效,是因为您使
name
指向字符串文本的地址,该地址在程序的生命周期内一直存在

但在此之前,您需要为
myVehicle
本身分配内存:

myVehicle = malloc(sizeof(*myVehicle));
或者只需将
myVehicle
作为对象而不是指针:

static vehicle myVehicle;
你想要

  myVehicle->name = strdup("foobar");
但别忘了以后免费下载

实际上,您通常不会
strdup
常量文本字符串(但如果该字符串以后可能会被覆盖,则需要这样做,因为常量文本字符串通常保留在只读段中,写入它们是未定义的行为)。您可以在某个缓冲区中构建一个字符串,并
strdup
该缓冲区。一个更现实的例子可能是:

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

您只声明了一个指针,而不是它所指向的实际内存。尝试:

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

完成后,不要忘记释放
myVehicle->name

“我是否需要事先在结构中预先分配字符串大小?”好的,noob问题:为什么不简单地执行
myVehicle->name=tmpName我不同意。这个问题是关于结构中字符串的内存分配。我读了那个问题,但它并没有解决我的问题。所以+1再次平衡它。哇。我发帖后32秒?谢谢那么,当包含该函数的函数完成时,代码不会自动清除声明的tmpName空间吗?它怎么知道我以后还会使用它呢?它不会被清除,正如你所说的malloc,malloc的内存是持久的,直到你显式地释放它(
free(myVehicle->name)
)。如果您在释放缓冲区之前丢失了指针,没有人会为您清理它,您将得到内存泄漏。在为myVehicle或name分配内存时,我得到一个编译器错误:“无法将类型为“int”的值分配给类型为“vehicle*”@shred444的实体,您需要
#include
hmjd,您是一个c怪物。谢谢你,伙计!