C 正在重新分配的指针不是';未分配

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

我想创建一个函数,根据分隔符(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 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只有一个字符。。