这是我第一次在这里问问题,我希望我做得对。我的 C 程序中有一个问题,导致它在 malloc(1) 上出现段错误。我花了很多时间试图找出它出现段错误的原因,但我就是无法弄清楚。我的程序的这一部分使用标识符分隔字符串。例如,字符串=“12wo4ne53wone86wo99w5ne”;标识符,开始=“wo”,结束=“ne”;将返回 {"wo4ne", "wone", "wo99w5ne"}。我的代码如下...
// basically like substring() in java
char* stringAt(char* str, int start, int end) {
int length = end - start + 1;
int temp = start;
char* savedChar = NULL;
savedChar = malloc(length + 1);
for(int x = 0; x < length; x++) {
savedChar[x] = str[temp];
temp++;
}
savedChar[length] = '\0';
return savedChar;
}
// finds "identifier" in string after certain position in that string
int findIdentifier(char* str, char* identifier, int pos, int isEnd) {
// checks first character with first character in "identifier"
for(int x = pos; x < strlen(str) - 1; x++) {
if(str[x] == identifier[0]) {
// if first characters match then check rest
for(int i = 0; i < strlen(identifier); i++) {
if(str[x + i] != identifier[i]) {
i = strlen(identifier);
}
if(i == strlen(identifier) - 1) {
// isEnd checks if you should count the last position of the identifier...
// -like ident="1234" then "end" is the position of "4".
// -not end be the position of "1"
if(isEnd == 1) {
return x + strlen(identifier) - 1;
}
return x;
}
}
}
}
return -1;
}
char** separateStrings(char* str, char* identifier, char* lastIdentifier) {
char** savedStr = NULL;
// segfault here!
savedStr = malloc(1);
// segfualt here!
int start = -2;
int end = 0;
int x = 0;
do {
// first run check/gets first and last positions of the identifier in the string
if(start == -2) {
start = findIdentifier(str, identifier, 0, 0);
} else {
start = findIdentifier(str, identifier, end + 1, 0);
}
end = findIdentifier(str, lastIdentifier, start + 1, 1);
if(start != -1) {
if(end == -1) {
end = strlen(str);
}
char* newStr = stringAt(str, start, end);
// dynamically increase the size of savedStr (x is iterated every run through here)
realloc(savedStr, x + 1);
savedStr[x] = malloc(strlen(newStr) + 1);
strcpy(savedStr[x], newStr);
x++;
}
} while(start != -1 && end != -1);
return savedStr;
}
我尝试查找为什么这不起作用,我唯一能想到的是缓冲区溢出。因此,我尝试运行 findIdentifier() 多次,但效果很好。该程序也不一致,有时比其他程序运行得更深入,但其结果是准确的。感谢您的帮助!
如果
savedStr
应该是动态分配的字符串数组,则分配 1 个字节的内存不足以存储指向 char
的指针(根据您的平台,这需要 4 或 8 个字节)。
即使您将其重新分配得更大,一次也仅添加 1 个字节。当您使用
savedStr[x] = malloc(strlen(newStr) + 1);
引用和分配时,您正在调用未定义的行为,在这种情况下,这似乎表现为分段错误。
你几乎肯定想要分配:
savedStr = malloc(sizeof(char *));
然后当你重新分配时:
realloc(savedStr, (x + 1) * sizeof(char *));