1

可能重复:
C 中的 char s[] 和 char *s 有什么区别?
char *str = “…” 和 char str[N] = “…” 的区别?

我有一个结构定义为:

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

4

3 回答 3

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;
于 2012-10-20T15:54:39.050 回答
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);
于 2012-10-20T15:54:44.650 回答
0

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

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

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

于 2012-10-20T15:54:45.413 回答