繁体   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