#include<stdio.h>
#include<stdlib.h>/span>
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)='';//id-001
int last=sizeof(x)/sizeof(x[0] )。)
printf("%d
", last); /My expected output is 7 but why I'm getting 2?
p=x。
for(int i=0;p! ='';i ){ /id-002
printf("%d"/span>,x[i])。
p ;
}
}
我應該如何需要改變id-001來停止我的整數指標?
我應該如何改變id-002,使我的for回圈條件在讀取堆陣列中的存盤值后停止?
uj5u.com熱心網友回復:
int last=sizeof(x)/sizeof(x[0]);/code>
這是不正確的,因為sizeof()只對那些在編譯時就知道大小的陣列起作用。在你的例子中,x是一個分配的指標,所以這只是用指標的大小(在x86_64上是8)除以int的大小(通常是4),因此你得到2。
我不確定你到底想用這個程式做什么,但是這里的終止條件可以被修正:
for(int i=0;p!='';i ){
在這里,你是在用NUL終止符來比較指標,而不是比較指標所指向的值。應該把它改為*p來檢查值:
for(int i=0;*p!='';i ){
你不需要再次推進指標,因為它已經被之前呼叫的*p = something推進了:
*( p) = ''; // id-001
所以把這個改為*p = ''.
在這個回圈中似乎有一個錯字,應該改成*p = a[j];:
for (int j =0; j < 3; j )
*p = a[j];
回圈本身存在緩沖區溢位,因為p在沒有任何邊界檢查的情況下被推進。它總共被推進了9次,這對于7號檔案來說是超界的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332989.html
標籤:
