我有一个程序分叉(它作为C套接字服务器工作)并且一切正常。在我分叉之前,我为我的两个结构分配了共享内存,这在以后执行时也可以正常工作:
abc->results = "Heyyy";
当我在另一个子流程中访问abc->results
时,我得到了#34; Heyyy"回。但是,我的C程序会构建一条消息,然后需要显示该消息:
//Results msg
char msg[46];
strcpy(msg, " {0,");
strcat(msg, cScore1);
if(score1 > 80) {
strcat(msg, ",Pass},");
} else {
strcat(msg, (",Fail},"));
}
strcat(msg, "{1,");
strcat(msg, cScore2);
if(score2 > 80) {
strcat(msg, ",Pass},");
} else {
strcat(msg, (",Fail},"));
}
strcat(msg, "{2,");
strcat(msg, cScore3);
if(score3 > 80) {
strcat(msg, ",Pass}");
} else {
strcat(msg, (",Fail}"));
}
abc->results = msg;
当改为此时,我会出现随机符号(奇怪的正方形和X' s)。偶尔我可以在奇怪的符号之前看到最后的}
。我的猜测是它与abc->results
的大小有关,但它是一个指针:
typedef struct myStruct {
char* results;
} structA;
我对C很新,所以任何帮助都很受欢迎。
编辑:
忘了一点关键信息。当我在同一进程中写入套接字时,会显示正确的消息:
abc->results = msg;
printf(msg);
printf("\n");
n = write(sock, abc->results, 47);
printf和write显示正确的结果。当我在子进程中再次使用它时(在不同的函数中,写入不同的客户端连接):
n = write(sock, abc->results, 47);
写函数参数与上面完全相同,所以我很困惑为什么它不起作用!
再次编辑:
我已将消息更改为char * msg = malloc(45);
。但是,现在当我在子进程中使用它时,我什么也得不到:
void myFunction(int sock) {
int n;
n = write(sock, abc->results, 47);
//This is not displayed either!
printf("\nResults:");
printf(abc->results);
printf("\n");
if (n < 0){
perror("Error writing to the socket");
exit(1);
} else {
printf("Results sent\n");
}
}
答案 0 :(得分:3)
abc->results = "Heyyy";
正在分配一个字符串文字,该字符串文字将持续该程序的生命周期。
abc->results = msg;
超出您职能范围的范围, msg
会立即失效。
这就是为什么第一种情况有效,但第二种情况并非如此。在后一种情况下,程序的行为是 undefined 。
修复很简单:使用msg
为malloc
分配内存。