c - 将 char* 类型转换为 int* 是否未定义?

标签 c arrays

我有一个函数来打印字符数组的内容:

#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/

相关文章:

c - 在 C 中,malloc(256) 和 malloc(sizeof(char)*256) 等价吗?

C - 如何返回所有偶数位设置为 1、所有奇数位设置为 0 的字?

c - getter 方法的互斥量导致死锁

arrays - Elasticsearch - 过滤其中(嵌套数组之一)和(所有嵌套数组)

c - C中的链表 && 使用函数来控制

c - 华氏温度到摄氏温度的转换不会打印出预期的结果

javascript - 仅当 Promise 解析时才使用 JS Array.push

java - 在 Java 中递归填充矩阵(二维数组)

java - 将数组的所有元素向左旋转 "k"位置,但我的代码将其向右移动

ios - 如何在连接到另一个 viewController 的标签中显示数组计数