如何在c语言中将字符数组设置为字符串

如何在c语言中将字符数组设置为字符串,c,operating-system,C,Operating System,所以我有一个结构调用进程信息 struct Process_Info { char name[128]; int pid; int parent_pid; int priority; int status; }; 和一个进程信息调用信息数组。我将info中的pid设置为整数,但当我尝试将info中的名称设置为“{kernel}”时,它会起作用,如下所示 info[i].name="{kernel}"; 它在赋值错误中给了我不兼容的类型。

所以我有一个结构调用进程信息

  struct Process_Info {
    char name[128];
    int pid;
    int parent_pid;
    int priority;
    int status;
      };
和一个进程信息调用信息数组。我将info中的pid设置为整数,但当我尝试将info中的名称设置为“{kernel}”时,它会起作用,如下所示

info[i].name="{kernel}";

它在赋值错误中给了我不兼容的类型。我在网上搜索,似乎我可以做到这一点,就像在,他们做了字符标签[]=“单一”;那么我做错了什么呢?

简短的回答是:C编译器会将常量字符串烘焙到二进制文件中,因此您需要使用(或者如果您不担心安全性)将“{kernel}”复制到
info[i].name

较长的答案是:无论何时你写作

char label[] = "Single";
C编译器将把字符串“Single”烘焙到它生成的二进制文件中,并将
label
制作成指向该字符串的指针。在C语言中,“Single”的类型是
constchar*
,因此不能以任何方式更改。但是,由于可以修改
char*
,因此不能将
const char*
分配给
char*

换句话说,你不能写作

char label[] = "Single";
label[0] = "T";
因为编译器不允许第二行。但是,您可以通过编写以下内容来更改
info[i].name

info[i].name[0] = '[';
因为
info[i]。如果类型为
char*
,则为name
。要解决此问题,您应该使用
strncpy
(我参考了上面的一个手册页)将字符串“{Kernel}”复制到
info[I].name
as中

strncpy(info[i].name, "{Kernel}", 256);
info[i].name[255] = '\0';

这将确保您不会使缓冲区溢出。

我想您可能弄错了。您将以一次一个字符的方式分配它,就像这样

name[] = {'a','b','c','d'};

对的链接的示例代码之所以有效,是因为它们在声明时正在初始化值。不是很准确。在第一个示例中,
label
是一个数组,而不是字符串,当然可以修改它。C允许通过文字字符串初始化数组,但不允许分配数组。可能重复的unfotunaly,在分配中可以执行的操作与在初始化中可以执行的操作不同,即使它们看起来相似。