Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将int指针强制转换为char ptr,反之亦然_C_Pointers_Types_Casting_C89 - Fatal编程技术网

将int指针强制转换为char ptr,反之亦然

将int指针强制转换为char ptr,反之亦然,c,pointers,types,casting,c89,C,Pointers,Types,Casting,C89,问题很简单。据我所知,GCC认为在32位环境中,字符将是字节对齐的,整数将是4字节对齐的。我还了解C99标准6.3.2.3,其中指出在未对齐指针类型之间进行转换会导致未定义的操作。C的其他标准对此怎么说?这里也有许多经验丰富的程序员-对此有任何看法都将不胜感激 int *iptr1, *iptr2; char *cptr1, *cptr2; iptr1 = (int *) cptr1; cptr2 = (char *) iptr2; CPU有big-endian和little-endian,

问题很简单。据我所知,GCC认为在32位环境中,字符将是字节对齐的,整数将是4字节对齐的。我还了解C99标准6.3.2.3,其中指出在未对齐指针类型之间进行转换会导致未定义的操作。C的其他标准对此怎么说?这里也有许多经验丰富的程序员-对此有任何看法都将不胜感激

int *iptr1, *iptr2;
char *cptr1, *cptr2;

iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;

CPU有big-endian和little-endian,因此结果是未定义的。
例如,对于强制转换后的字符指针,0x01234567的值可以是0x12或0x67。

C只有一个标准(ISO的标准),有两个版本(1989和1999),加上一些非常小的修订。所有版本和修订版均同意以下内容:

  • 所有数据存储器都是字节可寻址的,字符是字节
  • 因此,
    char*
    将能够处理任何数据
    • void*
      char*
      相同,只是它之间的转换不需要类型转换
  • int*
    转换到
    char*
    总是有效的,就像转换回
    int*
  • 将任意
    char*
    转换为
    int*
    不能保证有效
char指针保证能像这样工作的原因是,例如,您可以将整数从内存中的任何位置复制到内存或磁盘中的其他位置,然后再复制回来,这在低级编程(例如图形库)中是一件非常有用的事情。

您可以尝试执行以下操作:

iptr1 = atoi(cptr1); // val now = pointed by cptr1
cptr2 = atoi(iptr2); // val now = pointed by iptr2

这在DevCpp中对我有用

从int*到char*的转换总是有效的。另一方面,在某些CPU上它工作,而在其他CPU上则不工作。如果您感兴趣,下面将检查一个特定的情况:“void*与char*相同,只是与之之间的转换不需要类型转换”-也不能添加/减去它们。