在读取我的整数数组的所有元素后,如何为我的 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 码的范围。
#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 码的范围。