私はCで少し遊んでいて、Cプログラミングの一種のoopのテストプログラムを書こうとしています。Visual Studio 2010で見出しのエラーが発生します。gccを使用しても、このエラーは発生しません。
誰かが私が間違っていることを指摘できますか?おっと、他のトピック外の提案に間違った言語を使用する以外に。
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;
}
にメモリを割り当てようとするstring
と、ポインタ(string*
)に十分なメモリのみが割り当てられます。
self = (string*)malloc(sizeof(string*));
sizeof(string)
構造体へのポインタだけでなく、構造体全体を格納するのに十分なスペースが必要なため、代わりに割り当てる必要があります。はよりsizeof(string*)
も小さいためsizeof(string)
、他のコードは割り当てられた領域の外に書き込み、ヒープの破損を引き起こします。
同様に、文字のメモリをマロケートする場合、サイズは(len + 1) * sizeof(char)
。である必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加