1

だから私はこのコードを書きましたが、毎回同じ答えが得られます。ポインターに割り当てられたメモリを 4 ずつ増やしてから、値を出力します。

#include <stdio.h>

int main(void) {
    int n=0;
    char *name = "hello";
    scanf("%d",&n);

    for(int i =0; i<n;i++){
        name += sizeof(int);
        printf("%d \n", (sizeof(&name)));
    }
    return 0;
}

誰かが私を助けることができますか?ここで何が悪いのかわかりません。別のコードは必要ありません。これの何が問題なのかを理解したいだけです。

4

4 に答える 4

3

何が起こっているのかについての説明を次に示します。

#include <stdio.h>

int main(void) {
    int n=0;

        // this does not actually allocate any memory. It sets the POINTER name to point (like an arrow) to a read-only block that contains "hello"
    char *name = "hello";
        // string literals generally come in fixed read-only memory

    scanf("%d",&n);

    for(int i =0; i<n;i++){
            // this causes the pointer memory address to be incremented by sizeof(int) (typically 4)
            // after the first increment if it will point to a string "o" (incremented by 4 characters)
            // after the second increment it will point to some undefined memory behind "hello" in your virtual address space and will have undefined behaviour when accessed
        name += sizeof(int);

            // sizeof(&name) will give you the size of a char **. Pointer to a character pointer. 
            // Wich is the same size as all pointers.
            // = sizeof(void *) = 8 for 64-bit systems, 4 for 32-bit systems
        printf("%d \n", (sizeof(&name)));
    }
    return 0;
}

これはそれを行う方法です:

#include <stdio.h>

int main(void) {
    int n=0;

    // allocate 10 bytes of memory and assign that memory address to name
    char *name = malloc(10);
    // the size of that memory needs to be kept in a separate variable
    size_t name_length = 10;

    // copy the desired contents into that memory
    memcpy(name, "hello", sizeof("hello"));

    scanf("%d",&n);

    for(int i =0; i<n;i++){

        // reallocate the memory into something with sizeof(int) more bytes
        void * tmp = realloc(name, name_length += sizeof(int));
        // this can fail
        if (tmp) {
            name = tmp;
        } else {
            perror("realloc");
            exit(-1);
        }

        printf("%d \n", name_length);
    }
    return 0;
}
于 2013-06-25T15:36:22.763 に答える
0

コードを 1 つずつ見ていきましょう。

char *name = "hello"; 

これにより、文字の配列が作成'h','e','l','l','o',0され、最初の文字のメモリ アドレスが name に割り当てられます

for(int i =0; i<n;i++){
    name += sizeof(int);
    printf("%d \n", (sizeof(&name)));
}

ここでは、名前ポインターに int のサイズを追加します。これにより、このポインターはパスごとに 4 ずつインクリメントされます。

これは char ポインターであるため、ポインターは 4 バイトずつインクリメントされます。 sizeof(int) == 4

hello char 配列は動的配列ではないため、サイズを大きくすることはできません。

文字列のサイズを変更できるようにしたい場合は、文字を malloc してより大きな配列にコピーする必要があります。

于 2013-06-25T15:35:12.500 に答える