特定の状況でポインターがどのように機能するかを理解するのに苦労しています。私の混乱の詳細を以下に概説します。
buffer という名前の 8 バイト文字列の文字配列を作成しました。fread() を使用して、ファイルから 8 バイトをこの 8 バイト文字列の配列の要素の 1 つにロードしようとしています。
/c/file.txt にあるファイルの内容は次のとおりです。
プログラムで、値 ijklmnop の代わりに TESTTEST を buffer[1] にロードするだけで済みます。
buffer が実際にはポインターの配列であることはわかっています。この場合、これは、null で終了していない 3 つの連続したバイト配列の最初の要素のアドレスを含む 3 つの連続したメモリ アドレスです。
これを、末尾に \0 を付けずに ABCDEFGHijklmnopQRSTUVWX のバイナリ値を含む行に文字どおり 24 のメモリ アドレスとして視覚化します。
buffer[0] のアドレスは A を指すアドレスを指し、buffer[1] のアドレスは i を指すアドレスを指し、buffer[2] のアドレスは Q を指すアドレスを指します。
&buffer[1] への fread() が、buffer[1] に格納されているアドレスの場所に 8 バイトを読み取っていることがわかります。
&buffer+1、buffer+1、(buffer+1) などを使用して、この fread() でさまざまな試みを試みましたが、ほとんどの場合、セグメンテーション違反が発生しました。&buffer[1] は、私が望むことをほぼ実行しているようです。
printf("buffer[1] as %%s is %s\n", buffer[1]); を実行しようとしています。fclose() の前の終わり近くで、セグメンテーション違反が発生します。
理解に近づいていますが、何かが正しくなく、必要な基本的な概念を理解していません。
(buffer+1)[8] の終了が buffer[2] の最初のアドレスに波及するかどうか、またはそれがどのような影響を与えるかはわかりません。
私は一般的に少し混乱しているだけで、助けていただければ幸いです。
ありがとうございました!
ここに私のプログラム全体があります:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c[] = "OFFONOFF";
char *buffer[] = {"ABCDEFGH", "ijklmnop", "QRSTUVWX"};
char *t;
printf("the value in file /c/file.txt is TESTTEST, only those 8 bytes\n");
printf("the ls listing for /c/file.txt shows 9, I am not sure where the other character comes from\n");
printf("the value as %%s of buffer[0] is %s\n", buffer[0]);
printf("the value as %%s of buffer[1] is %s\n", buffer[1]);
printf("the value as %%s of buffer[2] is %s\n", buffer[2]);
printf("the sizeof(buffer[2]) is %d\n", sizeof(buffer[2]));
fp = fopen("/c/file.txt", "r");
fseek(fp, SEEK_SET, 0);
printf("the value as %%c of buffer[1][3] is %c\n", buffer[1][3]);
printf("the memory address as %%p for buffer+1 is %p\n", buffer+1);
fread(&buffer[1], strlen(c), 1, fp);
/* I am attempting to terminate the fread into &buffer[1] with a \0, removing this doesn't change much */
(buffer+1)[8] = "\0";
printf("the memory addreses below are all in %%p format\n");
printf("the memory address of buffer is %p\n", buffer);
printf("memory address of buffer[1] is %p\n", buffer[1]);
printf("memory address of &buffer is %p\n", &buffer);
printf("memory address of &buffer+1 is %p\n", &buffer+1);
printf("memory address of &buffer[1] is %p\n", &buffer[1]);
printf("memory address of buffer is %p\n", buffer);
printf("memory address of buffer[15] is %p\n", buffer[15]);
printf("memory address of buffer+15 is %p\n", buffer+15);
printf("memory address of *(buffer+1) is %p\n", *(buffer+1));
printf("the sizeof(buffer[0]) is %d\n", sizeof(buffer[0]));
printf("the sizeof(*(buffer+1)) is %d\n", sizeof(*(buffer+1)));
printf("the sizeof(buffer) is %d\n", sizeof(buffer));
printf("the value of *(buffer+0) as %%s is %s\n", *(buffer+0));
printf("the value of *buffer, the first element of the array of strings, as %%s is %s\n", *buffer);
printf("the value of buffer+1, the first element of the array of strings, as %%s is %s\n", buffer+1);
printf("buffer[0] as %%s is %s\n", buffer[0]);
printf("buffer+1 as %%s is %s\n", buffer+1);
printf("buffer[2] as %%s is %s\n", buffer[2]);
printf("buffer is %s\n", buffer+1);
printf("sizeof(*buffer) is %d\n", sizeof(*buffer));
fclose(fp);
return(0);
}
正確な出力は次のとおりです。
the value in file /c/file.txt is TESTTEST, only those 8 bytes
the ls listing for /c/file.txt shows 9, I am not sure where the other character comes from
the value as %s of buffer[0] is ABCDEFGH
the value as %s of buffer[1] is ijklmnop
the value as %s of buffer[2] is QRSTUVWX
the sizeof(buffer[2]) is 8
the value as %c of buffer[1][3] is l
the memory address as %p for buffer+1 is 0x7ffff7b23a28
the memory addreses below are all in %p format
the memory address of buffer is 0x7ffff7b23a20
memory address of buffer[1] is 0x5453455454534554
memory address of &buffer is 0x7ffff7b23a20
memory address of &buffer+1 is 0x7ffff7b23a38
memory address of &buffer[1] is 0x7ffff7b23a28
memory address of buffer is 0x7ffff7b23a20
memory address of buffer[15] is 0x400674
memory address of buffer+15 is 0x7ffff7b23a98
memory address of *(buffer+1) is 0x5453455454534554
the sizeof(buffer[0]) is 8
the sizeof(*(buffer+1)) is 8
the sizeof(buffer) is 24
the value of *(buffer+0) as %s is ABCDEFGH
the value of *buffer, the first element of the array of strings, as %s is ABCDEFGH
the value of buffer+1, the first element of the array of strings, as %s is TESTTEST
@
buffer[0] as %s is ABCDEFGH
buffer+1 as %s is TESTTEST
@
buffer[2] as %s is QRSTUVWX
buffer is TESTTEST
@