Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 调用memset会导致分段错误_C_Unix_Struct_Segmentation Fault_Memset - Fatal编程技术网

C 调用memset会导致分段错误

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

此程序在我的UNIX计算机上导致seg故障。我把原因缩小到memset()的第二次调用

为什么会发生这种行为?第一块代码和第二块代码几乎一样,不是吗?如果第二个调用失败,为什么第一个调用没有失败

我查看了其他关于segfaulting memset调用的线程,但没有一个与此类似

如果你想知道我为什么要写这样一个微不足道的程序,它是从我一直在写的另一个程序改编而来的,我用这个程序自学如何将memcpy()应用于结构

#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);