我在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;
}
答案 0 :(得分:2)
当您尝试为string
分配内存时,只为指针(string*
)分配足够的内存:
self = (string*)malloc(sizeof(string*));
您应该分配sizeof(string)
,因为您需要足够的空间来存储整个结构,而不仅仅是指向一个结构的指针。由于sizeof(string*)
小于sizeof(string)
,因此其他代码会在分配区域之外写入,从而导致堆损坏。
同样,当为字符mallocing内存时,大小应为(len + 1) * sizeof(char)
。