簡體   English   中英

需要幫助了解指針算法

[英]Need help understanding pointer arithmetic

我在理解指針算術或如何分配內存時遇到了麻煩。 在下面的代碼段中,我嘗試訪問“大小= 1”的值,該值位於“測試”之前的8個字節處,但是我沒有獲得大小的值,並且該值不是隨機的。 所以我可能對理解字節大小有疑問。 如果void *,long和char是8個字節,那么使用指針算法時應該有關系嗎?

#include <iostream>
using namespace std;

char arrayOfCrap[100];

void * what(){
    long * size ; 
    size = (long*)&arrayOfCrap[28];
    *size = 1;
    return ((void*) &arrayOfCrap[29]);
}

int main(){

    long * test;
    test =  (long*)what();
    *test = 1221;
    cout << "Value of test: " << *test << endl;
    cout << "Long number before test: " << *(test-1) << endl;
}

當main從what()的void *'指針向前移動時,該代碼起作用:

#include <iostream>
using namespace std;

char arrayOfCrap[100];

void * what(){
    long * size ; 
    size = (long*)&arrayOfCrap[28];
    *size = 1;
    return ((void*) &arrayOfCrap[28]);  //change from above
}

int main(){

    long * test;
    test =  (long*)what();
    test++;                             //change from above
    *test = 1221;
    cout << "Value of test: " << *test << endl;
    cout << "Long number before test: " << *(test-1) << endl;
}

您的代碼未在*test之前定位*size八個字節:

size = (long*)&arrayOfCrap[28];

arrayOfCrap是char arrayOfCrap[100]因此arrayOfCrap[28]是偏移量28的字符, arrayOfCrap[29]是偏移量29的字符。

究其原因test++工作原理是,測試的類型為long* ,因此增加它實際上移動到下一個位置久,而遞增char*或字符數組上使用索引給你一個字符的下一個位置。

您還可以執行以下操作之一:

void * what(){
    long * size ; 
    size = (long*)&arrayOfCrap[28];
    *size = 1;
    return size+1;
}

void * what(){
    long * size ; 
    size = (long*)&arrayOfCrap[28];
    *size = 1;
    return ((void*) &arrayOfCrap[28 + sizeof(long)];
}

順便說一句,將一個指針指向任何內存位置並將其視為指向另一種類型的指針並不一定安全。 一些平台要求某些類型是“對齊的”,或者僅在特定值倍數的地址上存在那些類型。 在那些平台上,讀取或寫入未對齊的對象可能會崩潰(總線錯誤)或具有未定義的行為。 同樣,某些平台可能不會崩潰或行為不正確,但是在讀取/寫入對齊的對象時具有更好的性能。 我知道這完全不適合您的實驗,但是對於真正的代碼,您應該知道這一點。 以下是在實際代碼中不可以執行的操作的示例:

int read_int(char *&c) {
  int out = *(int*)c; // c may not be properly aligned!
  c += sizeof(int);

  return out;
}

不幸的是,在通用平台x86上,未對齊的訪問通常只是緩慢而已,而並非總是會導致崩潰的,因此該平台的用戶必須特別小心。

當您增加一個指針時,它不會增加指針大小,而是增加指針類型的大小。 char*指針按sizeof(char)遞增, long*指針按sizeof(long)遞增

sizeof(char *)sizeof(long *)的大小都應相同(在32位系統上通常為4個字節,在64位系統上通常為8個字節)。

但是, sizeof(char)sizeof(long)不同。

您將指針大小與整數大小混淆了。

#include <iostream>
using namespace std;

int main()
{
    cout << "\n sizeof(char*)   " << sizeof(char *);
    cout << "\n sizeof(char)    " << sizeof(char);
    cout << "\n sizeof(long*)   " << sizeof(long *);
    cout << "\n sizeof(long)    " << sizeof(long);
}

在此處查看其運行情況: http : //ideone.com/gBcjS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM