1

我有以下代码:

int *edges[500];
char arr[] = {'c','d'};
edges[0] = arr;
printf("%c - %c", edges[0][0],edges[0][1]);

我想要显示的是c - d但实际显示的是c -
所以正如您在上面看到的,显示的是第一个元素而不是第二个元素。

为什么不显示数组的第二个元素?

4

6 回答 6

7

由于 anint和 a 的char大小不同,您应该尝试char *edges[500]

于 2009-10-19T15:23:49.740 回答
3

类型不匹配。edges是一个包含 500 个指向 int 的指针的数组,您将一个指向两个字符的指针分配给它的第一个元素。

于 2009-10-19T15:22:29.993 回答
2

那么,

tc:6: 警告:来自不兼容指针类型的赋值

消息可能与它有关。

在 C 中,'c'是一个(小)整数。您将它们存储为chars arr。但是,通过arras edges[0]which is an访问int *,您实际上是在检索(在大多数平台上)arr[0], arr[1],arr[2]arr[3]作为整数。

于 2009-10-19T15:21:24.597 回答
2

edges[0]被解释为带有元素 {(int)'cd' , 0} 的 int 数组(实际上,第二个元素可以包含任何垃圾)。

带有说明符 %c 的 printf 获取edges[0][0](即“c”)的第一个字节和edges[0][1](恰好为 0)的第一个字节。

将类型更改edgeschar* edgeds[500]

于 2009-10-19T15:22:51.100 回答
2

3号线

edges[0] = arr;

赋值中的不兼容类型:arris achar *edges[0]is a int *

会发生什么

int *edges[500];
char arr[] = {'c','d'};

arr[0] 是 'c' 而 arr[1] 是 'd'

edges[0] = arr;

忽略类型兼容性,edges[0] 指向int'c' 和 'd' (可能还有两个未指定字符)所在的地址。

printf("%c %c", edges[0][0],edges[0][1]);

边缘[0][0] 是边缘[0] 中的第一个整数:它是“c”、“d”(可能还有两个未指定的字符)的混合。该值被转换为无符号字符,产生被打印的“c”。
edge[0][1] 指向紧接在 'c'、'd' (可能还有两个未指定字符)的混合之后的整数。该内存位置尚未初始化,它很可能超出您的进程可以访问的范围。

如果您打印一个 int 而不是 2 个字符

printf("%d\n", edges[0][0]);

您将看到“c”、“d”(可能还有两个未指定的字符)的混合。

最好的办法是让你的类型正确。

于 2009-10-19T15:41:21.047 回答
0

edges是一个指向 int 的指针数组。该表达式edges[0]产生一个指向 int 的指针,而不是指向 char 的指针。将其视为 char 数组会导致计算错误的字节偏移量,从而导致显示意外内存的值,而不是保存 char 值“d”的内存。

数组偏移量根据指向的类型的大小计算偏移量(以字节为单位):

foo_t * x;
ptrdiff_t difference = x[1] - x[0];

的值difference将是sizeof(foo_t)字节。sizeof(char)定义为 1,sizeof(int)通常为 4,这意味着您的代码将取消引用 char 数组中 4 个字节的值,而不是 char 数组中的 1 个字节。

于 2009-10-19T15:31:05.087 回答