我正在处理套接字网络上的任务,并且有一个客户端和服务器可以连接和通信正常,只要我当时只发送一个数据请求。一旦我发送了5个数据的请求,服务器就会因malloc内存损坏而崩溃。
我有:
int number_of_jobs;
msg[0] = '0';
read(sd, &number_of_jobs, 4);
for(int i = 0; i < number_of_jobs; i++){
printf("Total bytes read: %lu\n", total_bytes_read);
printf("Size: %lu\n", size);
printf("i: %d\n", i);
char jobtype;
unsigned int len;
fread(&jobtype, sizeof(jobtype), 1, fp);
DEBUG_PRINT(("\n>>%d<< Jobtype: %c\n", getpid(), jobtype));
fread(&len, 4, 1, fp);
DEBUG_PRINT((">>%d<< Len: %d\n", getpid(), len));
header = make_header(jobtype, len, size);
read_line = malloc(sizeof(char)*len + 1);
int n = fread(read_line, sizeof(char), len, fp);
if(n <= 0){
printf(">>%d<< ", getpid());
perror("Fread error");
}
*(read_line + strlen(read_line)-1) = '\0';
total_bytes_read += strlen(read_line);
package = malloc(sizeof(char)*40 + sizeof(char)* strlen(read_line+1));
strncpy(package, header, 41);
strcat(package, read_line);
printf("%s\n", package);
if(write(sd, package, strlen(package)) < 0){
printf(">>%d<< ", getpid());
perror("Write error");
}
printf("Writing %zu bytes\n", strlen(read_line));
free(package);
free(header);
free(read_line);
}
我知道它与覆盖记忆有关(至少我是这么认为的?),但我不知道在哪里或为什么。
有效的部分基本上是for i&lt; number_of_jobs部分,我可以根据需要多次拨打电话。
答案 0 :(得分:2)
是什么让您认为read_line
以null结尾以致电*(read_line + strlen(read_line)-1) = '\0';
?如果你需要使它以空终止,你最好写read_line[n] = '\0'
。此后,您无需再致电strlen
,因为您已经知道自己已经读过n
个字节。