2

我在理解指针算法或如何分配内存时遇到了麻烦。在下面的代码片段中,我试图访问位于“test”之前 8 个字节的“size = 1”的值,但我没有得到 size 的值,并且该值不是随机的。所以我可能对理解字节大小有疑问。如果 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;
}
4

2 回答 2

4

您的代码之前没有找到*size八个字节*test

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

arrayOfCrap 是char arrayOfCrap[100]偏移arrayOfCrap[28]量 28arrayOfCrap[29]处的字符和偏移量 29 处的字符。

起作用的原因test++是 test 是 type long*,因此递增它实际上会长时间移动到下一个位置,而递增 achar*或使用 char 数组上的索引会为您提供 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 上,非对齐访问通常只是很慢,而不是总是会导致崩溃,因此该平台的用户必须特别小心。

于 2012-06-21T16:36:33.260 回答
2

当你增加一个指针时,它不是按指针大小增加,而是按指针类型的大小增加。一个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

于 2012-06-21T16:38:29.167 回答