1. ホーム
  2. c

[解決済み] mallocで文字列を確保する

2022-03-11 01:09:25

質問

C言語でプログラミングを始めたばかりで、今は文字列を勉強しています。 質問ですが、もし私が malloc (以下のコードのように)文字列の末尾にNULL文字が自動的に挿入されるのでしょうか? ここの他の質問で答えが見つかりましたが、NULL文字は自動的に含まれないようです。 しかし、ここで問題が発生します。 strlen はNULL文字がないと動作しませんが、このコードではNULL文字を使っており、動作しています。だから、私はそこに \0 を、どこにも書いていないのに、文字列の末尾につけています。 答えは何でしょう?

以下はそのコードです。

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

int main(int argc, char** argv) {
    char *stringa1;
    int n;
    int i;

    printf("How many characters in the string? ");
    scanf("%d", &n);

    stringa1 = (char*) malloc(n*sizeof(char));

    printf("Insert the string: ");
    scanf("%s", stringa1);

    free(stringa1);

    return 0;
}

解決方法は?

malloc() が返されます。 void* ヒープに格納されたメモリブロックへのポインタを指定します。で割り当てる。 malloc() ヌル文字を追加するには、自分で行うか、または、以下のような関数を使用します。 scanf() この文字を追加してくれます。とは言っても、この \0 という文字があらかじめ入っています。

あなたの malloc() の呼び出しは、代わりにこのようにする必要があります。

stringa1 = (char*) malloc((n+1)*sizeof(char)); /*+1 for '\0' character */

mallocの戻り値をキャストする必要はありません。詳しくは これ .

もう一つ、指摘すべきは sizeof(char)1 で、これを掛けると malloc() の呼び出しは必要ありません。

また malloc() が返す NULL . このようにすることができます。

if (stringa1 == NULL) {
    /* handle exit */

また strlen() はヌル文字で終端する文字列で、そうでなければ、これは結局 未定義の動作 .

一旦 scanf() が呼び出され stringa1 に何らかの文字が含まれている場合は strlen() を追加しました。

さらに scanf() も良いアイデアです。こんな感じでチェックできます。

if (scanf("%d", &n) != 1) {
    /* handle exit */

これらの変更を加えたあなたのコード。

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

int main(void) {
    char *stringa1 = NULL;
    size_t n, slen;

    printf("How many characters in the string? ");
    if (scanf("%zu", &n) != 1) {
        printf("Invalid input\n");
        exit(EXIT_FAILURE);
    }

    stringa1 = malloc(n+1);
    if (stringa1 == NULL) {
        printf("Cannot allocate %zu bytes for string\n", n+1);
        exit(EXIT_FAILURE);
    }

    printf("Insert the string: ");
    scanf("%s", stringa1);

    slen = strlen(stringa1);
    printf("String: %s Length: %zu\n", stringa1, slen);

    free(stringa1);
    stringa1 = NULL;

    return 0;
}