我正在嘗試存盤一個陣列的行地址。似乎地址被正確傳遞,但它們似乎并不指向存盤在陣列中的值。
我想保存這些地址,這樣我就可以在 Python 應用程式中使用它們。
#include <stdio.h>/span>
#include "func.h"
int main(int argc, const char * argv[]) {
uint64_t pkt[3] 。
func(pkt);
printf ("the address in main is %p
", pkt[0] )。)
printf ("the address in main is %p
", pkt[1] )。)
printf ("the address in main is %p
", pkt[2] )。)
uint8_t *ptr0 = (uint8_t*)pkt[0] 。
printf ("the address in main is %p
", ptr0)。)
printf("%d
", ptr0[0])。)
printf("%d
", ptr0[1] )。)
printf("%d
", ptr0[2] )。)
uint8_t *ptr1 = (uint8_t*)pkt[1] 。
printf ("the address in main is %p
", ptr1)。)
printf("%d
", ptr1[0])。)
printf("%d
", ptr1[1] )。)
printf("%d
", ptr1[2] )。)
uint8_t *ptr2 = (uint8_t*)pkt[2] 。
printf ("the address in main is %p
", ptr2)。)
printf("%d
", ptr2[0])。)
printf("%d
", ptr2[1] )。)
printf("%d
", ptr2[2] )。)
return 0;
#include "func.h"
void func(uint64_t* pkt)
{
uint8_t matrix[3][3] = { {3 。 ,
{1, 2 , 8} . ,
{8 , 3, 2}; {2, 3, 2}。} ;
int i = 0;
for(i = 0; i < 3; i )
{
pkt[i] = (uintptr_t)& matrix[i];
printf("The address is %p
", &matrix[i])。)
printf("The address is %p
", pkt[i])。)
}
}
uj5u.com熱心網友回復:
我不同意你的觀點。它按預期作業。然而,不能保證,甚至有點糟糕的編程,matrix的地址在從函式回傳后有效。因此,如果你不在堆中分配地址,你就不應該使用在本地函式中定義的東西的地址。
地址是0x7ffcfeae7f6f。
該地址是0x7ffcfeae7f6f。
地址是0x7ffceae7f72。
地址是0x7ffcfeae7f72。
地址是0x7ffcfeae7f75。
該地址是0x7ffcfeae7f75。
主體中的地址是0x7ffcfeae7f6f。
主體的地址是0x7ffcfeae7f72。
主體的地址是0x7ffcfeae7f75。
主體中的地址是0x7ffcfeae7f6f。
3
7
4
主體中的地址是0x7ffcfeae7f72。
1
2
8
主體中的地址是0x7ffcfeae7f75。
8
3
2 2
uj5u.com熱心網友回復:
在函式func中宣告的陣列matrix具有自動存盤期限。這意味著,在退出函式后,它將不會再存活。
因此,在退出函式后試圖訪問該陣列會引起未定義的行為。
你可以用靜態存盤時間來宣告陣列,例如
static uint8_t matrix[3][3] = { {3 , ,
{1, 2 , 8} . ,
{8 , 3, 2}; {2, 3, 2}。} ;
在這種情況下,在退出函式后,它將是活的,你可以通過一個指標間接地訪問其元素。
注意像這樣呼叫printf的情況
printf ("the address in main is %p
", pkt[0] )。)
使用不正確的轉換指定器%p,這又可以呼叫未定義的行為。
你的程式可以是下面的樣子。
你的程式可以是下面的樣子。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void func( uintptr_t *pkt )
{
static uint8_t matrix[3] [3] =
{
{ 3, 7, 4 },
{ 1, 2, 8 },
{ 8, 3, 2 }.
};
for (int i = 0; i < 3; i )
{
pkt[i] = ( uintptr_t ) matrix[i];
printf( "The address is %p
", ( void * )matrix[i] ) 。
printf( "The address is %" PRIuPTR "
", pkt[i] )。)
}
putchar( '
' )。
}
int main(void)
{
uintptr_t pkt[3] 。
func( pkt );
printf( "main的地址是%" PRIuPTR "
", pkt[0] )。)
printf( "main的地址是%" PRIuPTR "
", pkt[1] )。)
printf( "main的地址是%" PRIuPTR "
", pkt[2] ) 。
uint8_t *ptr0 = ( uint8_t * )pkt[0] 。
printf( "main的地址是%p
", ( void * )ptr0 ) 。
printf( "%u
", ptr0[0] ) 。
printf( "%u
", ptr0[1] ) 。
printf( "%u
", ptr0[2] ) 。
uint8_t *ptr1 = ( uint8_t * )pkt[1] 。
printf( "main的地址是%p
", ( void * )ptr1 ) 。
printf( "%u
", ptr1[0] ) 。
printf( "%u
", ptr1[1] ) 。
printf( "%u
", ptr1[2] ) 。
uint8_t *ptr2 = ( uint8_t * )pkt[2] 。
printf( "main的地址是%p
", ( void * )ptr2 ) 。
printf( "%u
", ptr2[0] ) 。
printf( "%u
", ptr2[1] )。)
printf( "%u
", ptr2[2] ) 。
return 0;
程式的輸出夜是
地址是0x5578e37f7010。
該地址是93977701216272。
該地址是0x5578e37f7013。
地址是93977701216275。
該地址是0x5578e37f7016。
地址是93977701216278。
主體中的地址是93977701216272。
主體地址是93977701216275。
主體地址是93977701216278。
主體中的地址是0x5578e37f7010。
3
7
4
主體中的地址是0x5578e37f7013。
1
2
8
在main中的地址是0x5578e37f7016。
8
3
2 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315433.html
標籤:
