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

时间:2012-02-17 03:49:48

标签: c operating-system

所以我有一个结构调用Process_Info

  struct Process_Info {
    char name[128];
    int pid;
    int parent_pid;
    int priority;
    int status;
      };

和Process_Info调用信息数组。我将信息中的pid设置为一个整数,但是当我尝试将info中的名称设置为“{kernel}”时这样

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

它给了我不兼容的分配错误类型。我在线搜索似乎我可以这样做,就像在http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/中一样,他们做了char标签[] =“单身”;我做错了什么?

2 个答案:

答案 0 :(得分:7)

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

答案越长:每当你写

char label[] = "Single";

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

换句话说,你不能写

char label[] = "Single";
label[0] = "T";

因为编译器不允许第二行。但是,可以通过编写类似

的内容来更改info[i].name
info[i].name[0] = '[';

因为info[i].name属于char *类型。要解决此问题,您应该使用strncpy(我在上面引用了手册页)将字符串“{Kernel}”复制到info[i].name

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

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

答案 1 :(得分:0)

我想你可能弄错了。你分配这个的方式就像一次一个char ...

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