C 中的 strcpy() 给了我分割错误



我正在尝试将名称分配给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;
}

相关内容

  • 没有找到相关文章

最新更新