pyt*_*bie 5 c unix struct memset segmentation-fault
该程序在我的UNIX机器上导致seg故障.我将原因缩小到memset()的第二次调用.
为什么会出现这种情况?代码的第一个"块"几乎与第二个相同,不是吗?为什么第二次调用memset segfault 时没有第一次调用?
我查看了有关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;
}
Run Code Online (Sandbox Code Playgroud)
sim*_*onc 11
FilesStruct *old_dir;
memset(old_dir,0,sizeof(FilesStruct));
Run Code Online (Sandbox Code Playgroud)
尝试写入未初始化的指针.这会导致未定义的行为,包括可能发生崩溃.它只是运气(好或坏,取决于你如何看待它),这种行为的第一个实例没有崩溃.
你需要为内存分配old_dir.最简单的方法是在堆栈上声明它
FilesStruct old_dir;
memset(&old_dir,0,sizeof(old_dir));
Run Code Online (Sandbox Code Playgroud)
或者您可以在堆上动态分配(确保在free不再需要对象时调用)
FilesStruct *old_dir = calloc(1, sizeof(*old_dir);
/* use old_dir */
free(old_dir);
Run Code Online (Sandbox Code Playgroud)
这同样适用于new_dir进一步降低代码.
| 归档时间: |
|
| 查看次数: |
13000 次 |
| 最近记录: |