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);
}
asmyVehicle->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怪物。谢谢你,伙计!