所以我有一个结构调用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"; 那我做错了什么?
简短的回答: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)
这将确保您不会溢出缓冲区.