调试错误:检测到堆损坏

时间:2015-05-26 13:59:29

标签: c visual-studio-2010 pointers malloc

我在C中玩了一下,试图在c编程中为oop编写一个测试程序。我在Visual Studio 2010中得到了标题的错误。在使用gcc时,我没有收到此错误。

任何人都可以指出我做错了什么,除了使用错误的语言进行oop以及其他非主题建议。

当我释放string_dispose中的顶级对象时,似乎发生了错误,但如果真的对错误的位置说了很多话,我就不会感到害羞。

欢迎任何有关代码改进的建议。使用数组语法不是一个选项,因为我想尝试指针算法。

头文件“strings.h”:

#ifndef STRINGS_H
#define STRINGS_H

struct strings
{
    char* s;
    int len;
};

typedef struct strings string;

void string_init(string* s, char* chars, int len);

string* string_new(char* chars, int len);

void string_dispose(string* s);

#endif

源文件“strings.c”:

#include "strings.h"
#include <stdlib.h>


void string_init(string* self, char* chars, int len)
{
    int i;

    self->s = (char*)malloc((len + 1) * sizeof(char*));
    for (i = 0; i < len; i++)
    {
        *(self->s + i) = *(chars + i);
    }
    *(self->s + len) = '\0';
    self->len = len;
}


string* string_new(char* chars, int len)
{
    string* self;
    self = (string*)malloc(sizeof(string*));
    string_init(self, chars, len);
    return self;
}


void string_dispose(string* self)
{
    free(self->s);
    free(self);
}

主文件:

#include <stdlib.h>
#include <stdio.h>
#include "strings.h"


int main(int argc, char* argv)
{
    string* s;
    int n = 5;
    char* x = (char*)malloc((n + 1) * sizeof(char*));
    x[0] = 'f';
    x[1] = 'u';
    x[2] = 'b';
    x[3] = 'a';
    x[4] = 'r';
    x[5] = '\0';
    s = string_new(x, n);   
    printf("the string: %s\n", s->s);
    printf("the length: %d\n", s->len);
    string_dispose(s);
    printf("This is way more important");
    return 0;
}

1 个答案:

答案 0 :(得分:2)

当您尝试为string分配内存时,只为指针(string*)分配足够的内存:

self = (string*)malloc(sizeof(string*));

您应该分配sizeof(string),因为您需要足够的空间来存储整个结构,而不仅仅是指向一个结构的指针。由于sizeof(string*)小于sizeof(string),因此其他代码会在分配区域之外写入,从而导致堆损坏。

同样,当为字符mallocing内存时,大小应为(len + 1) * sizeof(char)