English 中文(简体)
C方案如何产生这样的产出?
原标题:How does the C program generate such an output?
  • 时间:2009-09-30 12:15:40
  •  标签:
void main()
{
    char str[2][7] = {"1234567", "abcdefg"};
    char** p = str;
    printf("%d
", *(p+1));
    printf("%c
", *(p+1));
}

产出如下:

1631008309
5

<><>Edit>: 谢谢。 我看看,除了我假定的座右翼[0][4]外,这5只为0x35。 为什么我不能脱离这一奇怪的1631008309?

OMG, I m foolish sufficient toquest this question! 谢谢大家。

最佳回答

你在分配给你的2个阵列的记忆开始时,再次指出一个char。

当你增加1个点时,你按类型的规模移动,就这样就可以看出,你的系统显然有4个点。 然后,你将这一结果fer倒,把结果作为直截了当(%d),这使你在我的评论中提到的765人 un倒。 如果你不喜欢它,把它当作char子处理,那就正确了。

[我看到,“ASCII”对你获得的较大数目(0x61373635)的解释,只是为了完整起见,我补充说,“a765”是“ASCII”。]

问题回答

本条:

char** p = str;

没有任何意义。 <代码>为2阵列,共7个char。 在表达的情况下使用时,它评价了第一个要素,相当于:

&str[0]

具有“7个果园的点子”。 这在no way,类似于“点到点”,即p。 否则,它们就具有意义:

char *p = str[0];

char *p = str[1];

char (*p)[7] = str;

使用百分比并不能将甲型六氯环己烷的体积数转换成数字。 使用百分比表示,它预期所发现的价值将被解释为数字的双向表述,并转换为ASCII印刷版。

请注意,C标准界定了<代码>main(>方案回归代码>int,而不是void/code>。

考虑到该守则:

#include <stdio.h>
int main()
{
    char str[2][7] = {"1234567", "abcdefg"};
    char** p = str;
    printf("%d
", *(p+1));
    printf("%c
", *(p+1));
    return(0);
}

如用<条码>gcc-o x - Wall xx.c汇编,请示:

x.c: In function ‘main’:
x.c:5: warning: initialization from incompatible pointer type
x.c:6: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘char *’
x.c:7: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’

(如果你略去-Wall,你就没有接到格式警告。)

这告诉你,你正在通过一个点到<条码>。 印刷点并非完全有用。 然而,先前的警告也告诉你,你正在错开变代码<>p。 但是,净结果是<代码>p表示该空间在<代码>str上的开始。 页: 1

一个有趣的小rk子:通常,像“1234567”这样的插座包括一个终止的UNL ;在你的分光中,因为你明确指出,阵列的长度是7个,而不是8个,因此终止无效。 仔细阅读你的话!

该法典的另一变体是:

#include <stdio.h>
int main()
{
    char str[2][7] = {"1234567", "abcdefg"};
    char** p = str;
    printf("%d
", *(p+1));
    printf("%c
", *(p+1));
    printf("%p %p %p -- %p %p %p
", str, &str[0], &str[0][0], p, p+1, *(p+1));
    printf("%.4s
", (p+1));
    return(0);
}

这给我带来了以下产出(来自澳门):

1631008309
5
0xbffffa5e 0xbffffa5e 0xbffffa5e -- 0xbffffa5e 0xbffffa62 0x61373635
567a

请注意,地址号、“座标”和“座标”;[0][0]和“座标”均具有相同价值,<代码>p+1是四条随附。 当作为护卫处理时,它用头脑最后三条 by和第二条 by印。

另外,对于以<代码>gcc -m64 -o x64 x.c汇编的电子数据,产出如下:

1701077858
b
0x7fff5fbff9e0 0x7fff5fbff9e0 0x7fff5fbff9e0 -- 0x7fff5fbff9e0 0x7fff5fbff9e8 0x676665646362
bcde

我理解你的混淆,这两个发言完全相同。

两份声明(第1页)都提到在放弃之前进行愤怒的人,而缺席是把所有东西投到一纸空 argument中。

然后,打印本将 in缩到第二版面表上预印的果园。

这部法典更明确了在哪些方面:

void main()
{
  char str[2][7] = {"1234567", "abcdefg"};
  char** p = str;
  printf("%d
", *(p+1));
  printf("%c
", *(p+1));
  int n = *(p+1);
  char c = *(p+1);
  printf("0x%08X
", n);
  printf("0x%08X
", c);
}

哪些产出:

1631008309
5
0x61373635
0x00000035

这里对 st类安全的解释是:stdarg





相关问题
热门标签