Cast int* to const short int*
我正在使用库中的函数,其中最重要的函数采用类型为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /* simple program to convert int* to const short* */ #include <stdio.h> #include <iostream> #include <stdlib.h> void disp(const short* arr, int len) { int i = 0; for(i = 0; i < len; i++) { printf("ith index = %hd\ ", arr[i]); } } int main(int argc, char* argv[]) { int len = 10, i = 0; int *arr = (int *) malloc(sizeof(int) * len); for(i = 0; i < len; i++) { arr[i] = i; } disp(arr, len); return 0; } |
上面的代码段会编译。
到目前为止,这是我尝试过的:
1.尝试了C风格的转换。函数调用看起来像这样:
1 2 3 4 5 6 7 8 9 10 | ith index = 0 ith index = 0 ith index = 1 ith index = 0 ith index = 2 ith index = 0 ith index = 3 ith index = 0 ith index = 4 ith index = 0 |
这导致在编译时出错。
我的问题:
1.为什么方法1中的输出如此奇怪?那边发生了什么事?
2.我看到了一些使用方法2中的const删除const-ness的示例。我不知道如何添加相同的内容。
3.是否可以将
P.S:如果以前曾提出过此类问题,请告诉我。我用谷歌搜索,没有发现任何具体信息。
通常,从
如果您的函数需要指向一堆
发布几乎总是设计问题的征兆。如果您有一个采用
将
对,因此
因此,通过这种方式释放指针的结果是:a)未定义的行为,以及b)除非您确切地知道自己在做什么,否则可能都不想要。
您的代码输出与我期望的完全一样,因此很明显,您没有告诉我们您正在尝试做的事情!
编辑:请注意,由于指针是"大小相关的",因此如果将一个大小的指针转换为另一种大小的类型的指针,则数据的对齐方式将是错误的,这就是每个其他值都为之的原因在输出中为零-因为
因此,尽管编译器完全按照您的要求进行操作:指向
1 2 3 4 5 6 | short **sarr = malloc(sizof(short *) * 10); for(i = 0; i < 10; i++) { sarr[i] = (short *)(&arr[i]); // This may well not work, since you get the"wrong half" of the int. } |
如果这给出了错误的一半,则可以执行以下操作:
1 | sarr[i] = (short *)(&arr[i])+1; // Get second half of int. |
但是它取决于"字节顺序"(大字节序或小字节序),因此它不是可移植的。在通用代码中执行此操作非常糟糕。
或:
short * sarr = malloc(sizof(short *)* 10);
1 2 3 4 | for(i = 0; i < 10; i++) { sarr[i] = (short)(arr[i]); } |
第二种方法的工作方式是将整数数组的副本复制到短数组中。这也不取决于内容的存储顺序或类似内容。当然,如果
在两种情况下,当不再需要阵列时,请不要忘记释放它们。
回答q.1
输出一点也不奇怪。显然,您的编译器为每个
0 0 0 0
0 0 0 1
0 0 0 2
0 0 0 3
0 0 0 4
...
当您将
0 0
0 0
0 0
0 1
0 0
0 2
0 0
...
我希望您能看到效果,以及为什么在分配的数字之间突然出现
回答第2个问题
函数
回答第3个问题
请查看@Pete和@Mats
的答案