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

hel*_*lp 0 c operating-system

所以我有一个结构调用Process_Info

  struct Process_Info {
    char name[128];
    int pid;
    int parent_pid;
    int priority;
    int status;
      };
Run Code Online (Sandbox Code Playgroud)

和一组Process_Info调用信息.我将信息中的pid设置为一个整数,它可以工作,但是当我尝试将info中的名称设置为"{kernel}"时,就像这样

info[i].name="{kernel}";
Run Code Online (Sandbox Code Playgroud)

它给了我不兼容的类型赋值错误.我在网上搜索似乎我可以这样做,比如http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/,他们做了char label [] ="Single"; 那我做错了什么?

Ada*_*cin 7

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

更长的答案:每当你写作

char label[] = "Single";
Run Code Online (Sandbox Code Playgroud)

C编译器将字符串"Single"烘焙到它生成的二进制文件中,并生成label指向该字符串的指针.在C语言术语中,"单一"是类型的const char *,因此不能以任何方式改变.但是,您无法将a分配const char *给a char *,因为char * 可以修改a.

换句话说,你不能写

char label[] = "Single";
label[0] = "T";
Run Code Online (Sandbox Code Playgroud)

因为编译器不允许第二行.但是,您可以info[i].name通过编写类似的内容进行更改

info[i].name[0] = '[';
Run Code Online (Sandbox Code Playgroud)

因为info[i].name如果是类型char *.要解决此问题,您应该使用strncpy(我在上面引用了一个手册页)将字符串"{Kernel}"复制为info[i].nameas

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

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

  • 正确.链接的示例代码工作的原因是因为它们在声明时初始化值. (2认同)