我正在尝试将名称分配给TCP服务器中的客户端,但是strcpy()
函数给了我一个分段错误。
struct clients{
int client_fd;
char* name;
struct clients* next;
}
struct clients* first;
first->client_fd = 1;
first->name = NULL;
memset(&first->name, 0, sizeof(first->name));
first->name = (char*)malloc(100*sizeof(char));
strcpy(first->name, "User");
first->next = NULL;
指针struct clients* first;
不指向任何malloc
内存,因此尝试访问其上的属性(如first->client_id = 1
(是未初始化的指针取消引用。
由于取消引用后行为未定义,因此分段错误可能发生在strcpy
(或其他任何地方,但strcpy
不是罪魁祸首(。考虑使用像valgrind这样的工具来识别这些非法内存访问。
也
台词:
first->name = NULL; memset(&first->name, 0, sizeof(first->name));
不要真正执行任何操作,因为随后会覆盖
first->name
内存位置。您可以省略这些。(char*)malloc(100*sizeof(char));
可以只是malloc(5)
.sizeof(char)
保证为 1 个字节,(char *)
是不必要的强制转换,100
内存对于"User"
来说太多了,只需要 5 个字符(一个用于空终止符(。free
分配的内存以避免泄漏。检查
malloc
的返回值以确保内存已成功分配是个好主意。您可以使用
strdup
而不是malloc
/strcpy
对,但这样做的缺点是您可能会忘记strdup
需要释放的已分配内存。
这是重写(省略malloc
返回检查(:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct clients {
int client_fd;
char* name;
struct clients* next;
};
int main(void) {
struct clients* first = malloc(sizeof(*first));
first->client_fd = 1;
first->name = malloc(5);
strcpy(first->name, "User");
first->next = NULL;
printf("%d %sn", first->client_fd, first->name); // => 1 User
free(first->name);
free(first);
return 0;
}