在读取我的整数数组的所有元素后,如何为我的 for 循环提供条件以停止我的整数指针?

How to give condition to my for loop to stop my integer pointer after reading all elements of my integer array?

#include<stdio.h>

#include<stdlib.h>

int main()

{ int a[3];

int *x=(int *) malloc (7*sizeof(int));

int *p=x;

scanf("%d %d %d",&a [0],&a[1],&a [2]); 
for(int i=0;i<3; i++)
{
if(i==0)
for(int j=0; j<3;j++)
    *p++=a[j];
else if (i==1)
    for (int j=0; j<3; j++) 
    *p++=a[j]+a[(j+1)%3];
else
    for(int j=0; j<3;j++)
    *p+=a[j];

}
*(++p)= '[=10=]';//id-001

int last=sizeof(x)/sizeof(x[0]); 
printf("%d\n", last); //My expected output is 7 but why I'm getting 2?
p=x;

for(int i=0;p!='[=10=]';i++){   //id-002
printf("%d ",x[i]);
p++;
}
}

我应该如何更改 id-001 来停止我的整数指针?

我应该如何更改 id-002 我的 for 循环条件以在读取堆数组中的存储值后停止?

int last=sizeof(x)/sizeof(x[0]);

这是不正确的,因为 sizeof() 仅适用于大小在编译时已知的数组。在你的例子中 x 是一个分配的指针所以这只是将指针的大小(x86_64 上的 8)除以 int 的大小(通常是 4),因此你得到 2.

我不确定你到底想用这个程序做什么,但这里的终止条件可以固定:

for(int i=0;p!='[=13=]';i++){

此处您将指针与 NUL 终止符进行比较,而不是指针指向的值。应该改成*p检查值:

for(int i=0;*p!='[=15=]';i++){

您不需要再次前进指针,因为它会在之前调用 *p++ = something:

时前进

*(++p) = '[=22=]'; // id-001

所以将其更改为 *p = '[=17=]'

这个循环好像有错字,应该改成*p++ = a[j];:

for (int j = 0; j < 3; j++)
  *p += a[j];

循环本身存在缓冲区溢出,因为 p 是在没有任何边界检查的情况下进行的。总共前进了 9 次,超出了 7 码的范围。