所以我一直在编写一些C库供我自己使用,我一直在膨胀,直到我的最新库,它只包含一堆字符串函数。你可以通过问题标题来判断,我得到一个SIGSEGV信号。问题是这样的:我的研究表明,大约99%的所有SIGSEGV错误都是由于堆栈溢出造成的,这本身是由于错误的递归,但正如您将看到的,我没有使用任何递归。此外,还会出现一些奇怪的问题。首先,printf表现出很多时髦的行为。 GDB遇到printf调用但实际上似乎没有执行它们,直到稍后几行代码。同样地,我的一个printf语句正在以某种方式被分解,只有一部分被调用,另一部分显然被切断了。
以下是关键代码片段,有些内容被命名为有趣,因为我怀疑名字冲突可能是某一点上的原因而且可能有点过分......
" firstIndexOf" function(在字符串中查找字符的第一个索引,如果该字符在所述字符串中),在第31行找到:
int firstIndexOfFUNCTION(char thisChar, char* inThisString)
{
int lengthABC = strlen(inThisString);
printf("\nLength of %s is %d",inThisString,lengthABC);
int thisFunctionsIndex;
for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
{
printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
if (inThisString[thisFunctionsIndex] == thisChar)
{
printf("\nMatch found on iteration %d!",thisFunctionsIndex);
return thisFunctionsIndex;
}
}
printf("\nNo matches detected...");
return -3;
}
&#34; string_functions_test&#34;第62行的函数(一个仅用于测试其他函数的函数):
int string_functions_test()
{
printf("PROGRAM INITIALIZED!\n\n");
char* sft_string;
int sft_index;
sft_string = malloc(sizeof(char)*100);
sft_string = "B um sbm. Sbm B bm.";
printf("2nd BREAKPOINT");
sft_index = firstIndexOfFUNCTION('B',sft_string);
sft_string[sft_index] = 'I';
return 0;
}
最后但并非最不重要的是,好的&#39;主要,在第107行:
int main(int argc, char* argv[])
{
string_functions_test();
return 0;
}
以下是我的代码的逐步执行的gdb输出:
(gdb) b 105
Breakpoint 1 at 0x400970: file string_functions.c, line 105.
(gdb) run
Starting program: /home/user/Development/projects/c/string_functions/source/c/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffde98) at string_functions.c:109
109 string_functions_test();
(gdb) step
string_functions_test () at string_functions.c:64
64 printf("PROGRAM INITIALIZED!\n\n");
(gdb) next
PROGRAM INITIALIZED!
68 sft_string = malloc(sizeof(char)*100);
(gdb) next
69 sft_string = "B um sbm. Sbm B bm.";
(gdb) next
71 printf("2nd BREAKPOINT");
(gdb) next
73 sft_index = firstIndexOfFUNCTION('B',sft_string);
(gdb) step
firstIndexOfFUNCTION (thisChar=66 'B', inThisString=0x400ab9 "B um sbm. Sbm B bm.") at string_functions.c:33
33 int lengthABC = strlen(inThisString);
(gdb) next
34 printf("\nLength of %s is %d",inThisString,lengthABC);
(gdb) next
2nd BREAKPOINT
36 for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
(gdb) next
38 printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
(gdb) next
Length of B um sbm. Sbm B bm. is 19
0th iteration:
-char 1 is B
39 if (inThisString[thisFunctionsIndex] == thisChar)
(gdb) next
41 printf("\nMatch found on iteration %d!",thisFunctionsIndex);
(gdb) next
-char2 is B
42 return thisFunctionsIndex;
(gdb) next
47 }
(gdb) next
string_functions_test () at string_functions.c:75
75 sft_string[sft_index] = 'I';
(gdb) next
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400883 in string_functions_test () at string_functions.c:75
75 sft_string[sft_index] = 'I';
(gdb) next
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) quit
您可能会注意到printf打印了&#34; 2nd Breakpoint&#34;被调用,然后程序在看到结果之前进入不同的函数。我假设这是gcc编译器的一些令人讨厌的行为,意味着作为一个cpu优化,但它现在显然搞砸了我。同样,我的for
循环中的printf在第一个格式化的char之后被分解。这两件事让人很难发现究竟发生了什么。有谁经历过类似的行为?
如果重要,我包括:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
答案 0 :(得分:2)
您首先将指针sft_string
指向malloc
返回的内容。在下一行中,您将其指向文字字符串。你需要复制它。文字内置于源代码中,在执行期间无法更改。否则会引发段故障,这意味着正在更改具有代码的内存区域。使用strcpy
。