0
int main()
{
 unsigned char a[3];
 unsigned char (*p)[3]=NULL;
 unsigned char *q=NULL;
 int i = 0;
 a[0]=0;
 a[1]=1;
 a[2]=2;
 p=&a;
 for(i=0;i<3;i++){
   if((*p)[3] == a[3]){
     printf("*p[%d]:%d a[%d]:%d",i,(*p)[3],i,a[3]);
   }
 }
}

o/p:
*p[0]:0 a[0]:0*p[1]:0 a[1]:0*p[2]:0 a[2]:0
Exited: ExitFailure 14

サイズ3の配列をポインタにコピーして比較したい。サンプルプログラムを書きました。しかし、私はエラー値を取得しています。オンラインの c コンパイラを使用してこれを実行しました。(codepad.org) 私の間違いを特定するのを手伝ってください。

4

2 に答える 2

4

変数pはポインタではなく配列です。配列を別の場所を指すように再割り当てすることはできないため、行

p = &a;

有効じゃない。

また、ご存知のように C は 0 からインデックスを作成する[3]ため、サイズ 3 の配列のインデックスを使用した比較は有効ではありません。

さらに、比較ループでは、実際にはインデックスを使用していませんiが、代わりに常に無効な定数 index を使用して比較しています[3]

コードからはあまり明確でqはありませんが(たとえば、使用されていません)、次のようなことをしたいように聞こえます:

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

unsigned char a[3];
unsigned char *p;

p = malloc(sizeof a);
if(p != NULL) /* If allocation succeeded, p is valid. */
{
  int i;

  memcpy(p, a, sizeof a);
  for(i = 0; i < sizeof a; ++i)
  {
    if(p[i] == a[i])
      printf("p[%d]:%d a[%d]:%d\n", i, p[i], i, a[i]);
  }
  free(p);
}

もちろん、memcpy()メモリのコピーに失敗することはないため、これは常にすべての数値を出力します。:)

于 2012-07-20T06:56:38.353 に答える
1

ここで main 関数の戻り値の型をintとして宣言しましたが、そこから何も返していません。したがって、任意の整数値 (1 など) を返すか、メイン関数の戻り値の型を void にします。

于 2012-07-20T07:32:14.130 に答える