Tag: 分段 故障

strtok中的分段错误

我一直在收到这个错误。 我很确定它与内存分配有关,但我不太确定如何修复它。 #include #include #include #include char * VOWELS =”aeiouAEIOU”; void printLatinWord(char *a); int main(int argc, char **argv){ char phrase[100]; char *word = malloc(sizeof(char) *100); printf(“Enter the phrase to be translated: \n”); fgets(word, 100, stdin); printf(“The phrase in Pig Latin is:\n”); word = strtok(phrase, ” “); printLatinWord(word); return 0; } void printLatinWord(char *word){ while (strchr(VOWELS, […]

没有在C中获得分段错误

这是c代码: char **s; s[334]=strdup(“test”); printf(“%s\n”,s[334]);` 我知道strdup会分配“test”,但是我们将把指针放到字符串“test”的情况下[334]没有分配,但是,这个代码就像一个魅力

在C中调用fork()之后引用指针

所以,我有一个函数,用一些字符串数据加载一个char **变量。 我的目标是分叉进程,并在子进程中打印一些数据,并从父进程中打印一些数据。 但是,我在fork()调用后无法引用指针。 我认为fork()制作了父进程的整个地址空间的副本,似乎它将包含各种堆栈指针…… 基本上,我的代码目前看起来像这样: load_data(char **data); char** data; load_data(data); printf(“String 0: %s\n”, data[0]); fork(); printf(“String 0 again: %s\n”, data[0]); /* Segfaults Here! */ 任何人都有任何想法,我做错了什么? 我已经做了一些谷歌搜索,这似乎我正在做的应该工作 – 但它没有。 因此,我误解了一些基本的东西……

GCC:分段故障和调试程序,仅在优化时崩溃

这是线程的后续跟进: C:分段错误,也许GDB对我说谎 我有一个用-O0编译好的程序,但用-O1,-O2,-O3和Ofast编译段错误。 似乎堆栈在某种程度上会被破坏,但我无法弄清楚为什么或在哪里。 首先,这是我正在使用的结构的一部分。 它位于头文件中: typedef struct { GLuint nsHandle; } OGL_STATE_T; 这是主文件中相关的淡化部分: void init(OGL_STATE_T *state) { printf(“init: %p\n”, state); // Print pointer address make sure it’s the same. compileShaders(state); } int main(argc, char *argv[]) { static OGL_STATE_T _state, *state=&_state; printf(“main: %p\n”, state); // Print pointer address init(state); return 0; } 然后这是compileShaders函数。 这是指针地址损坏发生的地方: void […]

指向另一个结构的指针,从文件中写入和读取它会产生SegFault

我正在从学习C The Hard Way中刷出我的C技能,目前我正在进行第17次练习 。 我正在做“额外积分”部分。 使该页面上给出的数据库代码得到我正在尝试 “更改代码以接受MAX_DATA和MAX_ROWS的参数,将它们存储在Database结构中,并将其写入文件,从而创建一个可以任意resize的数据库” 所以,我注释掉#define指令,并更改了给定的地址和数据库结构: struct Address { int id; int set; char *name; char *email; }; struct Database { int MAX_DATA; int MAX_ROWS; struct Address *rows; }; 这样,我可以从用户那里获得MAX_DATA和MAX_ROWS参数,以根据自己的喜好创建数据库。 我在代码中更改的其他内容是 – Database_create函数: void Database_create(struct Connection *conn, int MAX_DATA, int MAX_ROWS) { int i = 0; conn->db->MAX_DATA = MAX_DATA; conn->db->MAX_ROWS = MAX_ROWS; […]

为什么应用程序无法访问来自共享库的malloc内存?

我维护一个用C语言编写的库,用户可以在Linux上直接从Python使用加载共享库和调用函数的模块访问。 该模块是非常常用的,正如这个版本的共享库一样,人们在做一个流行的教程 。 用户正在获得分段错误。 在gdb下运行他的Python脚本,他发现它位于共享库中,在一个函数内,为一个结构的mallocs内存并返回指针。 他正在返回指针,但当他尝试在后续调用共享库时使用它时,会发生分段错误,因为内存不可访问。 如果他以root身份运行Python脚本,则不会发生此问题。 它也不会出现在备用Linux安装中。 所以回顾一下: 他的Python代码加载了共享库。 然后它调用一个函数,该函数返回指向共享库中分配的内存的指针。 然后他调用共享库中的另一个函数,并传入它返回给他的指针,共享库扼杀它自己的指针。 它只发生在“4.0.7-2-ARCH x86_64 GNU / Linux”上作为普通用户运行时。 当他切换到root并运行它时,该操作系统上不会发生这种情况。 当他试图在Ubuntu机器上重现问题时不会发生这种情况。 是什么赋予了? 这是一些ARCH错误吗? 或者是否存在可以清除的编程细微差别? 您可以在这里阅读细节,其中包含足够的细节来重现问题,如果问题对于具有比我更多Linux编程经验的用户来说不是不言而喻的。 指向共享库函数的快速链接: TCOD_map_new的源代码。 TCOD_map_set_properties的源代码。 他的Python代码摘录为后代和易于访问: #!/usr/bin/env python2 import curses import libtcodpy as libtcod def main(stdscr): curses.start_color() curses.use_default_colors() map = libtcod.map_new(10, 10) # any numbers work libtcod.map_set_properties(map, 0, 0, True, True) # any in […]

为什么选择SIGSEGV?

为什么这段代码会抛出一个SIGSEGV : int main() { unsigned long toshuffle[9765625]; unsigned long i; for (i=0; i< 1000; i++) toshuffle[i]= i; return 0; } 指针将不胜感激。 (没有双关语:))

通过写入2D数组来分割错误

我的程序中有一个小的内存访问问题,我没有找到错误,也许有人可以帮助我。 我创建了一个新类型来存储rgb颜色值。 那种类型看起来像: typedef struct pixel { unsigned char r; unsigned char g; unsigned char b; } pixel; 在我的主程序中,我用calloc创建了一个2D动态数组,用于存储红色信息。 pixel **pixelvalue = (pixel **) calloc(imginformation.width, sizeof(pixel)); for (i = 0; i < imginformation.width; i++) { pixelvalue[i] = (pixel *) calloc(imginformation.height, sizeof(pixel)); } 之后我调用我的函数,它读取颜色值,谁应该将它们安全地保存到数组中。 该函数作为参数获取数组。 ReadFile(file, imginformation (Stuff like height and so one), pixelvalue (The calloc […]

C:数组初始化段错误取决于大小并调用printf()

另一位学生问我他的C代码有什么问题。 我成功地重现了错误的行为,完全不知道为什么会出现这种错误。 考虑一下这个小小的C程序: #include int main(void) { int N = 590; double A[N][N]; double B[N][N]; double C[N][N]; printf(“done”); } 将N设置为值<= 590: 这运行没有错误,有或没有输出。 将N设置为> 590的值: 在删除输出线的情况下运行完美无缺。 编译并运行输出: 分段错误 这是什么原因? 谁能解释一下?

解除引用cout指针时的C ++ SegFault

我是C ++的新手,只是试图抓住它。 它通常看起来不是太糟糕,但我偶然发现了这种奇怪/病态的segfaulting行为: int main () { int* b; *b = 27; int c = *b; cout << "c points to " << c << endl; //OK printf( "b points to %d\n", *b); //OK // cout << "b points to " << (*b) << endl; – Not OK: segfaults! return 0; } 如此给出的这个程序产生了你所期望的: c points […]