未分配指针

时间:2019-04-30 23:04:36

标签: c pointers memory-management

我想创建一个函数,该函数根据分隔符(winter-is-coming-> winter | is | coming)将给定的字符串分隔为其子字符串,并在双字符指针的末尾返回空字符串。当我在C90标准的mac os x下运行此代码时,我得到的第一个字符串为“ winter”(〜w,wi,win,wint,winte,winter〜当我在循环中打印temp时),但随后突然崩溃并给出此错误:

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;
}

2 个答案:

答案 0 :(得分:0)

乍一看,我很怀疑

result = (char **)malloc(sizeof(char*));

我认为你应该有类似的东西

result = (char **)malloc(MAX_NUMBER_OF_DIFFERENT_SUBSTRINGS * sizeof(char*));

有意义吗?

否则

 *(result +c)

没有道理。...

所以尝试增加分配给结果的内存。...

但这可能只是故事的一部分

答案 1 :(得分:0)

分配不足-按1。

长度为manifest字符串需要N N+1。在C中不需要强制转换。

char

代码可能无法很好地指示从// 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 ** split("", .-)是UB。


可能存在其他问题。