2015-05-26 3 views
0

Я немного поиграю в C и попытаюсь написать тестовую программу для своего рода программирования в c программировании. Я получаю сообщение об ошибке заголовка в 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; 
} 

ответ

2

При попытке для выделения памяти для string, вы выделяете достаточно памяти для указателя (string*):

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

Вы должны выделить sizeof(string) вместо этого, так как вы хотите достаточно места для хранения всего-структуру, а не просто указатель на один. Поскольку sizeof(string*) меньше, чем sizeof(string), другой код записывается за пределами выделенной области, вызывая повреждение кучи.

Аналогичным образом, при хранении памяти для символов размер должен быть (len + 1) * sizeof(char).

+0

sizeof (char) всегда 1, так что просто '(len + 1)' будет достаточно. –

+0

@SamiKuhmonen: Это даже будет слишком много и утерять память. Это та же ошибка, только с менее серьезными последствиями. – sth

Смежные вопросы