0

VS C++ について誤解があります。バージョン 2010 では、以下のコードは正常に動作します。文字列を取得でき、あとがきでメモリを解放できます。

 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>

 #define MAX 14

 void GetString(char **str);

 int main(int argc, char *argv[])
 {
    char *str = NULL;
    GetString(&str);
    printf("%s\n", str);

    getchar();

    free(str);

    return 0;
 }

 void GetString(char **str)
 {
    char *s = (char *) malloc(sizeof(char) * MAX);
    strcpy(s, "HELLO, WORLD!");
    *str = s;
 }

しかし、VS 2008 では、上記のコードでメモリ破損エラーが発生します。使用される基準にわずかな違いがあると思います。私は正しいですか?いいえの場合、同じコードが異なるバージョンの Visual Studio で機能しない理由を教えてください。

ご回答ありがとうございます。

ps 何が起こるのか気になりますが、トピックに関する情報はまだ見つかりませんでした。

pps 使用言語 - C

4

1 に答える 1

1

必要なヘッダーが含まれていないため、コンパイラによってコードが異なる方法で解釈される可能性があります。次を追加する必要があります。

#include <stdlib.h>

malloc()明確な関数を作成します。

も呼び出しstrcpy()ているため、次のものが必要です。

#include <string.h>

そして必要なI / Oを実行します:

#include <stdio.h>

また、C では次のようになります。

char *s = (char *) malloc(sizeof(char) * MAX);

次のように書く方が良いです:

char *s = malloc(MAX);

以来

  1. 戻り値をキャストするのは悪い考えですmalloc()
  2. sizeof (char)は常に 1 であるため、煩雑になるだけです。

最後に、もちろんmalloc()、返されたポインターを使用する前に、それが成功することを確認する必要があります。

于 2013-02-05T13:14:06.440 に答える