指向char数组的指针只包含最后几个内容字母

时间:2016-02-01 11:18:13

标签: c

我有一个程序分叉(它作为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");
}
}

1 个答案:

答案 0 :(得分:3)

abc->results = "Heyyy";正在分配一个字符串文字,该字符串文字将持续该程序的生命周期。

一旦abc->results = msg;超出您职能范围的范围,

msg会立即失效。

这就是为什么第一种情况有效,但第二种情况并非如此。在后一种情况下,程序的行为是 undefined

修复很简单:使用msgmalloc分配内存。