我有一个函数来打印字符数组的内容:
#include <stdio.h>
void print_array(char * array, int n) {
char* start;
for(start = array; start - array < n && printf("%d\n", *start); start++);
}
int main() {
char array[5] = {'a', 'b', 'c', 'd', 'e' };
print_array(array, 5);
return 0;
}
这可以很好地打印:
97
98
99
100
101
如果我将函数更改为这样,麻烦就开始了:
void print_array(int * array, int n) {
int* start;
for(start = array; start - array < n && printf("%d\n", *start); start++);
}
然后像这样调用函数:
print_array((int*)array, 5);
这会打印垃圾。
1684234849
101
1973473280
8388443
80884992
我在编译时打开了-Wall
并且它没有抛出任何警告。为什么当我输入指针时我会得到垃圾?
最佳答案
从 int*
到 const char*
的转换是明确定义的。
如果基础数据是 int[] 数组,但您无法转换 const char* 指向的数组中的任意点,则反之亦然。指向 int*
的指针:您可能不遵守对齐要求。
在您的情况下,因此行为是未定义,因为您从char
数组开始。
关于c - 将 char* 类型转换为 int* 是否未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45303282/