C 调用memset会导致分段错误
此程序在我的UNIX计算机上导致seg故障。我把原因缩小到memset()的第二次调用 为什么会发生这种行为?第一块代码和第二块代码几乎一样,不是吗?如果第二个调用失败,为什么第一个调用没有失败 我查看了其他关于segfaulting memset调用的线程,但没有一个与此类似 如果你想知道我为什么要写这样一个微不足道的程序,它是从我一直在写的另一个程序改编而来的,我用这个程序自学如何将memcpy()应用于结构C 调用memset会导致分段错误,c,unix,struct,segmentation-fault,memset,C,Unix,Struct,Segmentation Fault,Memset,此程序在我的UNIX计算机上导致seg故障。我把原因缩小到memset()的第二次调用 为什么会发生这种行为?第一块代码和第二块代码几乎一样,不是吗?如果第二个调用失败,为什么第一个调用没有失败 我查看了其他关于segfaulting memset调用的线程,但没有一个与此类似 如果你想知道我为什么要写这样一个微不足道的程序,它是从我一直在写的另一个程序改编而来的,我用这个程序自学如何将memcpy()应用于结构 #include <stdio.h> #include <std
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int x;
char text;
} FilesStruct;
int
main(int argc, char** argv)
{
FilesStruct *old_dir;
memset(old_dir,0,sizeof(FilesStruct));
old_dir->x = 3;
old_dir->text = 'c';
printf("old dir: %d,%c\n",old_dir->x,old_dir->text);
FilesStruct *new_dir;
memset(new_dir,0,sizeof(FilesStruct));
new_dir->x = 7;
new_dir->text = 'g';
printf("new dir: %d,%c\n",new_dir->x,new_dir->text);
return 0;
}
#包括
#包括
类型定义结构{
int x;
字符文本;
}文件结构;
int
主(内部argc,字符**argv)
{
filestruct*old_dir;
memset(old_dir,0,sizeof(filestruct));
旧目录->x=3;
旧目录->文本='c';
printf(“旧目录:%d,%c\n”,旧目录->x,旧目录->文本);
filestruct*新目录;
memset(new_dir,0,sizeof(filestruct));
新建目录->x=7;
新建目录->文本='g';
printf(“新目录:%d,%c\n”,新目录->x,新目录->文本);
返回0;
}
尝试写入未初始化的指针。这会导致未定义的行为,包括可能的碰撞。这只是运气(好或坏,取决于你如何看待它)这种行为的第一次没有崩溃
您需要为旧目录
分配内存。最简单的方法是在堆栈上声明它
FilesStruct old_dir;
memset(&old_dir,0,sizeof(old_dir));
或者可以在堆上动态分配(确保在不再需要对象时调用free
)
这同样适用于代码后面的
new\u dir
。既不初始化old\u dir
也不初始化new\u dir
,因此这是未定义的行为。一种解决方案是在堆栈上分配两个变量:
FilesStruct old_dir;
//...
FilesStruct new_dir;
调用memset
时,使用和操作符获取地址:
memset(&old_dir,0,sizeof(FilesStruct));
这定义了一个filestruct指针。它是未初始化的,因此它实际上并不指向FileStruct的任何存储
memset(old_dir,0,sizeof(FilesStruct));
将告诉memset将旧的_dir指向的内容归零,但由于指针未初始化,因此会出现未定义的行为
您需要为指针提供存储空间,例如
FilesStruct *old_dir = malloc(sizeof(FilesStruct));
在您的情况下,您实际上不需要指针或动态分配的内存,您可以这样做
FilesStruct old_dir;
memset(&old_dir,0,sizeof(FilesStruct));
old_dir.x = 3;
old_dir.text = 'c';
printf("old dir: %d,%c\n",old_dir.x,old_dir.text);
哦,我打算用memset作为初始化器,我想我搞错了。所以我的声明只声明了一个指针,而不是底层结构;因此,我需要在memset设置为0之前分配内存?@Noob是的,就是这样
memset(old_dir,0,sizeof(FilesStruct));
FilesStruct *old_dir = malloc(sizeof(FilesStruct));
FilesStruct old_dir;
memset(&old_dir,0,sizeof(FilesStruct));
old_dir.x = 3;
old_dir.text = 'c';
printf("old dir: %d,%c\n",old_dir.x,old_dir.text);