堆损坏问题 - C.

  • 本文关键字:问题 损坏 c malloc
  • 更新时间 :
  • 英文 :


我正在制作一个"简单"的打印字符串,附加字符串并从字符串中删除部分。附加和新字符串有时有效,有时不输出任何内容。当我这样做时:

char * temp = malloc(newSize);

它只是停止输出任何东西。

我已经在部分注释了所有内容,试图找到问题所在。似乎找不到问题,但谷歌不断提出"堆损坏"。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
    char * data;
    int length;
} String;
int str_getLength(const char * characters)
{
    int index = 0;
    while (1)
    {
        if (characters[index] == '') break;
        index++;
    }
    return index;
}
String str_new(const char * characters) 
{
    String result;
    result.length = str_getLength(characters);
    result.data = malloc(result.length);
    memcpy(result.data, characters, result.length);
    return result;
}
void str_append(String * str, const char * characters) 
{
    int charsLength = str_getLength(characters);
    str->data = realloc(str->data, charsLength);
    for (int i = 0; i < charsLength; i++) {
        str->data[i + str->length] = characters[i];
    }
    str->length = str->length + charsLength;
}
void str_remove(String * str, int startIndex, int endIndex) 
{
    if (startIndex < 0 || endIndex > str->length || endIndex < startIndex) {
        return;
    }
    int chunkSize = endIndex - startIndex;
    int newSize = str->length - chunkSize;
    char * temp = malloc(newSize);
    // for (int i = 0; i < str->length; i++) 
    // {
    //  if (i < startIndex || i > endIndex) {
    //      temp[i] = str->data[i];
    //  } 
    // }
    // free(str->data);
    // str->length = newSize;
    // str->data = temp;
}
}
int main() 
{
    String str = str_new("Hello, ");
    printf("%sn", str.data);
    str_append(&str, "this is my first C application.");
    printf("%sn", str.data);
    str_remove(&str, 0, 3);
    printf("%sn", str.data);
    free(str.data);
    return 0;
}

我希望它输出一个修改后的字符串,它没有,有时它什么也不输出。我是初学者,对不起,如果这是一个快速解决方案。

除了火焰答案。问题不多了。

// for (int i = 0; i < str->length; i++) 
// {
//  if (i < startIndex || i > endIndex) {
//      temp[i] = str->data[i];
//  } 
// }

您将越界访问temp。您需要为 temp 维护单独的索引。

char * temp = malloc(newSize+1);
int k=0;
for (int i = 0; i < str->length; i++) 
 {
  if (i < startIndex || i > endIndex) {
      temp[k++] = str->data[i];
  } 
}
 temp[k] = ''; 
 free(str->data);
 str->length = newSize;
 str->data = temp;

追加后不会null终止字符串。

str->data = realloc(str->data, str->length + charsLength +1); //current length + new length + 
for (int i = 0; i < charsLength; i++) {
    str->data[i + str->length] = characters[i];
}
 str->data[i + str->length] = ''; //null terminate the new string
str->length = str->length + charsLength;

重新分配有两个问题。首先,您不会将realloc的结果分配给str->data,因此如果内存被重新分配到其他位置,tr->data之后会指向无效内存。其次,您没有添加字符串和附加部分的大小,您只是采用要附加的部分的大小。

这里

realloc(str->data, charsLength);

应该是:

str->data = realloc(str->data, charsLength + str->length + 1);

相关内容

  • 没有找到相关文章

最新更新