C 正在重新分配的指针不是';未分配
我想创建一个函数,根据分隔符(winter is coming->winter | is | coming)将给定字符串与其子字符串分开,并在双字符指针的末尾返回空字符串。在C90标准的mac os x下运行此代码时,当我在循环中打印temp时,我得到的第一个字符串为“winter”(~as w,wi,win,wint,winte,winter~),但随后它突然崩溃并出现以下错误:C 正在重新分配的指针不是';未分配,c,pointers,memory-management,C,Pointers,Memory Management,我想创建一个函数,根据分隔符(winter is coming->winter | is | coming)将给定字符串与其子字符串分开,并在双字符指针的末尾返回空字符串。在C90标准的mac os x下运行此代码时,当我在循环中打印temp时,我得到的第一个字符串为“winter”(~as w,wi,win,wint,winte,winter~),但随后它突然崩溃并出现以下错误: untitled2(30275,0x109cf25c0) malloc: *** error for object
untitled2(30275,0x109cf25c0) malloc: *** error for object 0x7fec9a400630: pointer being realloc'd was not allocated
untitled2(30275,0x109cf25c0) malloc: *** set a breakpoint in malloc_error_break to debug
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char ** split(char *str, char delimeter) {
int i = 0;
int c = 0;
int k = 1;
char **result;
result = (char **) malloc(sizeof(char*));
*result = (char *) malloc(sizeof(char));
char * temp;
temp = *result;
while (str[i] != '\0') {
if (str[i] != delimeter) {
*(temp + i) = *(str + i);
i++;
temp = (char *) realloc(*(result + c), sizeof(char) * (i + 1));
continue;
}
else {
c++;
k++;
result = (char **) realloc(result, sizeof(char *) * k);
*(result + c) = (char*) malloc(sizeof(char));
i++;
*(temp + i) = '\0';
}
}
printf("%s\n", result[0]);
return result;
}
int main() {
char *cpr;
cpr = (char *) malloc(sizeof(char) * strlen("winter-is-coming"));
strcpy(cpr, "winter-is-coming");
printf("%s\n", split(cpr, '-')[0]);
return 0;
}
#包括
#包括
#包括
字符**拆分(字符*str,字符delimeter){
int i=0;
int c=0;
int k=1;
字符**结果;
结果=(char**)malloc(sizeof(char*));
*结果=(char*)malloc(sizeof(char));
字符*温度;
温度=*结果;
while(str[i]!='\0'){
if(str[i]!=delimeter){
*(临时+i)=*(临时+i);
i++;
temp=(char*)realloc(*(result+c),sizeof(char)*(i+1));
继续;
}
否则{
C++;
k++;
结果=(char**)realloc(结果,sizeof(char*)*k);
*(结果+c)=(char*)malloc(sizeof(char));
i++;
*(温度+i)='\0';
}
}
printf(“%s\n”,结果[0]);
返回结果;
}
int main(){
char*cpr;
cpr=(char*)malloc(sizeof(char)*strlen(“冬天来了”);
strcpy(cpr,“冬天来了”);
printf(“%s\n”,split(cpr,“-”)[0]);
返回0;
}
我第一眼就怀疑
result = (char **)malloc(sizeof(char*));
我想你应该吃点
result = (char **)malloc(MAX_NUMBER_OF_DIFFERENT_SUBSTRINGS * sizeof(char*));
这有意义吗
否则
*(result +c)
没有道理
所以试着增加分配给result的内存
但这可能只是故事的一部分仅仅从我第一眼看到的情况来看,我是怀疑的
result = (char **)malloc(sizeof(char*));
我想你应该吃点
result = (char **)malloc(MAX_NUMBER_OF_DIFFERENT_SUBSTRINGS * sizeof(char*));
这有意义吗
否则
*(result +c)
没有道理
所以试着增加分配给result的内存
但这可能只是问题的一部分分配不足-1 长度为
N
的字符串需要N+1
char
。C中不需要强制转换
// cpr = (char *)malloc(sizeof(char)*strlen("winter-is-coming"));
cpr = malloc(strlen("winter-is-coming") + 1);
// Robust code would check for allocation success
if (cpr == NULL) {
return EXIT_FAILURE;
}
strcpy(cpr,"winter-is-coming");
代码可能无法从
split()。例如,考虑<代码> char **(“,”-)< /代码>。然后也是printf(“%s\n”,结果[0])代码>是UB
可能存在其他问题。分配不足-按1
长度为N
的字符串需要N+1
char
。C中不需要强制转换
// cpr = (char *)malloc(sizeof(char)*strlen("winter-is-coming"));
cpr = malloc(strlen("winter-is-coming") + 1);
// Robust code would check for allocation success
if (cpr == NULL) {
return EXIT_FAILURE;
}
strcpy(cpr,"winter-is-coming");
代码可能无法从split()。例如,考虑<代码> char **(“,”-)< /代码>。然后也是printf(“%s\n”,结果[0])代码>是UB
可能存在其他问题。如果指针为NULL
,则只能realloc
未分配的指针。有些系统会将内存分配归零,但这不是C标准所定义的。将未初始化的指针传递到realloc
是个坏主意。但在那之前,事情就出了问题,比如*(temp+i)=*(str+i)
解除对未初始化指针的防护。但我已在代码开始时初始分配了要重新分配的指针(结果)。它已分配给c=0,而不是我在else语句中需要时分配的指针。您分配了双指针,但没有分配随后解除引用的任何偏移量。(结果+c)=(char)malloc(sizeof(char));这行不是在进行分配吗?如果指针realloc
为空,则只能realloc
一个未分配的指针。某些系统会将内存分配归零,但这不是C标准定义的。将未初始化的指针传递到realloc
,这是一个坏主意。但在这之前,*(temp+i)=*(str+i);
它解除对未初始化指针的保护。但我最初已经分配了指针(result)我想在代码开始时重新分配它。它已分配给c=0,而不是我在else语句中需要它时分配的。您分配了一个双指针,但没有随后取消引用的任何偏移量。(结果+c)=(char)malloc(sizeof(char));这行不是在进行分配吗?这是合理的,但我没有最大数量的子字符串。请输入一个较大的数字,看看它是否有帮助……抱歉,这只是一个尝试让事情正常运行的建议……这段代码的全部要点是使用动态数组,谢谢anyway@Crazy_39365好的,-我部分是建议在看看这是否能解决问题-或者问题是否在其他地方,但我明白你使用动态数组的意思。这是合理的,但我没有最大数量的子字符串。请输入一个较大的数字,看看它是否有帮助…抱歉,这只是一个尝试让事情正常工作的建议…这段代码的全部要点是使用动态数组,谢谢anyway@Crazy_39365好的,-我部分是建议添加一个数字,看看这是否能解决问题-或者问题是否在其他地方,但我明白您使用动态数组的意思。感谢您的回答,测试数据确保至少有一个delimeter,delimeter只有一个字符..谢谢对于答案,测试数据确保至少有一个delimeter,delimeter只有一个字符。。