- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码会导致段错误。可执行文件名为“./struct”
#include <stdio.h>
#define VERSION_NUMBER_LEN 32
#define MAX_DESCRIPTION_COUNT 32
#define DESCRIPTION_LEN 128
int main(void)
{
struct foo {
char number[VERSION_NUMBER_LEN + 1];
char description[MAX_DESCRIPTION_COUNT][DESCRIPTION_LEN];
};
struct foo asdf = {
"1.1", { "clap", "clap", "stomp", NULL }
};
struct foo hjkl = {
"1.2", { "clop", "clop", "stamp", NULL }
};
int i;
printf( "%s\n", asdf.number );
for( i = 0; (asdf.description)[i] != NULL; i++ ){
printf( "\t%s\n", (asdf.description)[i]);
}
printf("\n");
printf( "%s\n", hjkl.number );
for( i = 0; (hjkl.description)[i] != NULL; i++ ){
printf( "\t%s\n", (hjkl.description)[i]);
}
}
输出如下所示:
1.1
clap
clap
stomp
��
N���~�����������ջ�����e���t�����������A���P���b���������������̽��㽊����,���V���g���y���������������̾�� ���k�����������Ͽ��迊�
迊�
ome/tiger
56
y
vZxy/ssh
ptop:/tmp/.ICE-unix/2710
usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:~/bin:~/vitetris-0.3.6:/var/lib/gems/1.8/bin/
baz
GNOME_KEYRING_PID=2692
t \w\n\$
XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/
9a6bf0ef61ded7872065094fca55d1
se
Segmentation fault
我运行了 valgrind:
$ valgrind -v --leak-check=full --track-origins=yes ./struct
<snip>
==15228== Conditional jump or move depends on uninitialised value(s)
==15228== at 0x402605B: __GI_strlen (mc_replace_strmem.c:284)
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Uninitialised value was created by a stack allocation
==15228== at 0x4060B01: (below main) (libc-start.c:96)
==15228==
==15228== Conditional jump or move depends on uninitialised value(s)
==15228== at 0x4026067: __GI_strlen (mc_replace_strmem.c:284)
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Uninitialised value was created by a stack allocation
==15228== at 0x4060B01: (below main) (libc-start.c:96)
==15228==
==15228== Invalid read of size 1
==15228== at 0x4026058: __GI_strlen (mc_replace_strmem.c:284)
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Address 0xbec1007c is not stack'd, malloc'd or (recently) free'd
==15228==
==15228==
==15228== Process terminating with default action of signal 11 (SIGSEGV)
==15228== Access not within mapped region at address 0xBEC1007C
==15228== at 0x4026058: __GI_strlen (mc_replace_strmem.c:284)
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== If you believe this happened as a result of a stack
==15228== overflow in your program's main thread (unlikely but
==15228== possible), you can try to increase the size of the
==15228== main thread stack using the --main-stacksize= flag.
==15228== The main thread stack size used in this run was 8388608.
==15228== Syscall param write(buf) points to uninitialised byte(s)
==15228== at 0x4107DC3: __write_nocancel (syscall-template.S:82)
==15228== by 0x40B0A1E: new_do_write (fileops.c:530)
==15228== by 0x40B0D35: _IO_do_write@@GLIBC_2.1 (fileops.c:503)
==15228== by 0x40B181C: _IO_file_overflow@@GLIBC_2.1 (fileops.c:881)
==15228== by 0x40B2DED: _IO_flush_all_lockp (genops.c:849)
==15228== by 0x40B3A4F: _IO_cleanup (genops.c:1010)
==15228== by 0x41670F0: ??? (in /lib/tls/i686/cmov/libc-2.11.1.so)
==15228== by 0x401F4F3: _vgnU_freeres (vg_preloaded.c:62)
==15228== by 0xBEC0D5F7: ???
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Address 0x402a054 is not stack'd, malloc'd or (recently) free'd
==15228== Uninitialised value was created by a stack allocation
==15228== at 0x4060B01: (below main) (libc-start.c:96)
<snip>
==15228== HEAP SUMMARY:
==15228== in use at exit: 0 bytes in 0 blocks
==15228== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==15228==
==15228== All heap blocks were freed -- no leaks are possible
==15228==
==15228== ERROR SUMMARY: 7 errors from 4 contexts (suppressed: 12 from 7)
==15228==
==15228== 1 errors in context 1 of 4:
==15228== Syscall param write(buf) points to uninitialised byte(s)
==15228== at 0x4107DC3: __write_nocancel (syscall-template.S:82)
==15228== by 0x40B0A1E: new_do_write (fileops.c:530)
==15228== by 0x40B0D35: _IO_do_write@@GLIBC_2.1 (fileops.c:503)
==15228== by 0x40B181C: _IO_file_overflow@@GLIBC_2.1 (fileops.c:881)
==15228== by 0x40B2DED: _IO_flush_all_lockp (genops.c:849)
==15228== by 0x40B3A4F: _IO_cleanup (genops.c:1010)
==15228== by 0x41670F0: ??? (in /lib/tls/i686/cmov/libc-2.11.1.so)
==15228== by 0x401F4F3: _vgnU_freeres (vg_preloaded.c:62)
==15228== by 0xBEC0D5F7: ???
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Address 0x402a054 is not stack'd, malloc'd or (recently) free'd
==15228== Uninitialised value was created by a stack allocation
==15228== at 0x4060B01: (below main) (libc-start.c:96)
==15228==
==15228==
==15228== 1 errors in context 2 of 4:
==15228== Invalid read of size 1
==15228== at 0x4026058: __GI_strlen (mc_replace_strmem.c:284)
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Address 0xbec1007c is not stack'd, malloc'd or (recently) free'd
==15228==
==15228==
==15228== 1 errors in context 3 of 4:
==15228== Conditional jump or move depends on uninitialised value(s)
==15228== at 0x402605B: __GI_strlen (mc_replace_strmem.c:284)
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Uninitialised value was created by a stack allocation
==15228== at 0x4060B01: (below main) (libc-start.c:96)
==15228==
==15228==
==15228== 4 errors in context 4 of 4:
==15228== Conditional jump or move depends on uninitialised value(s)
==15228== at 0x4026067: __GI_strlen (mc_replace_strmem.c:284)
==15228== by 0x408A79E: vfprintf (vfprintf.c:1617)
==15228== by 0x40912BF: printf (printf.c:35)
==15228== by 0x8048910: main (in /home/tiger/dev/development/c/play/struct)
==15228== Uninitialised value was created by a stack allocation
==15228== at 0x4060B01: (below main) (libc-start.c:96)
==15228==
--15228--
--15228-- used_suppression: 12 dl-hack3-cond-1
==15228==
==15228== ERROR SUMMARY: 7 errors from 4 contexts (suppressed: 12 from 7)
好吧...所以我有几个内存位置,valgrind 显示为未初始化,但我不明白如何...结构和内部字符串是静态定义的,并且结构的每个实例都是显式声明的.
我认为当访问第二个结构(hjkl)中的元素之一时发生段错误。
运行 gdb...
(gdb) p asdf
$1 = {number = "1.1", '\000' <repeats 29 times>, description = {"clap", '\000' <repeats 123 times>, "clap", '\000' <repeats 123 times>,
"stomp", '\000' <repeats 122 times>, '\000' <repeats 127 times> <repeats 29 times>}}
(gdb) p hjkl
$2 = {number = "1.2", '\000' <repeats 29 times>, description = {"clop", '\000' <repeats 123 times>, "clop", '\000' <repeats 123 times>,
"stamp", '\000' <repeats 122 times>, '\000' <repeats 127 times> <repeats 29 times>}}
我只是没有看到是什么导致了段错误......
最佳答案
您的测试(asdf.description)[i] != NULL
已被破坏,并且永远不会成立。修复方法如下:
#include <stdio.h>
#define VERSION_NUMBER_LEN 32
#define MAX_DESCRIPTION_COUNT 32
#define DESCRIPTION_LEN 128
int main(void)
{
struct foo {
char number[VERSION_NUMBER_LEN + 1];
char description[MAX_DESCRIPTION_COUNT][DESCRIPTION_LEN];
};
struct foo asdf = {
"1.1", { "clap", "clap", "stomp", "" }
};
struct foo hjkl = {
"1.2", { "clop", "clop", "stamp", "" }
};
int i;
printf( "%s\n", asdf.number );
for( i = 0; (asdf.description)[i][0] != 0; i++ ){
printf( "\t%s\n", (asdf.description)[i]);
}
printf("\n");
printf( "%s\n", hjkl.number );
for( i = 0; (hjkl.description)[i][0] != 0; i++ ){
printf( "\t%s\n", (hjkl.description)[i]);
}
}
关于c - 结构体初始化导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10876345/
《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) 在Rust中,结构体(Struct)是一种自定义数据类型,它允许我们将多个相关的值组合在一起,形成一个
这个问题已经有答案了: In C, does a pointer to a structure always point to its first member? (3 个回答) 已关闭 7 年前。
当执行第二个fscanf时,控制台停止工作。我做错了什么? 输入文件包含: 3 minsu 50 80 40 sarah 30 60 40 jason 70 80 90 代码: #define _CR
Swift 结构体是构建代码所用的一种通用且灵活的构造体。 我们可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能。 与 C 和 Objective C 不同的是: 结构
我想在 javascript 中创建一个结构。我有一对信息,我想使用,例如: array[1] = new Struct(); array[1].name = "parameter-name"; ar
我不允许使用带有 in 关键字的结构,对吗?例如: struct Rect { float x,y,width,height; }; layout(location = 7) in Rect
我的结构声明的片段: struct record{ char type[4]; uint32_t data_size; uint32_t flags; uint32_t
您能否帮助我理解为什么我的 dataStruct 结构的值不是其成员之一的值? (对于simpleDataStruct结构) 我用这一行打印值: printf("dataStruct:........
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
我不确定如何在 C 中创建一个具有不同位大小的变量的结构,例如: 我想创建一个结构体,其中一个变量作为 8 位整数,一个变量作为 16 位 bool 值,一个变量作为 8 位 bool 值,一个变量作
我正在为一个项目编写一个通信协议(protocol),其中包括两个用于请求和响应的 C 结构。根据设备的设置方式,数据传输可以是请求(主模块)或响应(从模块)。 这些结构彼此非常接近。最大的区别在于请
我有以下 C 结构体,代表外部芯片中的寄存器 typedef union { // Individual Fields struct { uint8_t ELEM_1
我了解 C++,并且正在学习 C。我想将 nullptr 定义为 NULL,但是当我使用括号初始化结构时,它会导致错误并显示预期的“}”。我正在使用 Visual Studio 编译器,我的代码示例如
#include struct s { char *a1; int a; }; int main(){ struct s p={"asdv",11}; struct s p1=p;
如果将记录作为参数发送给函数,如何添加记录? struct record { char name[20]; int nr; }; void AddRecord(struct record **p_al
使用python向C语言的链接库传递数组、结构体、指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctype
枚举、结构体、类 注:本文为作者自己总结,过于基础的就不再赘述 ,都是亲自测试的结果。如有错误或者遗漏的地方,欢迎指正,一起学习。 1、枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum
Swift 结构体是构建代码所用的一种通用且灵活的构造体 可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能 与 C 和 Objective C 不同的是: 结构体不需要包
关于结构的快速问题: struct xint { int number; char string[12]; }; int main(int argc, char *argv[])
我是一名优秀的程序员,十分优秀!