C String打印垃圾字符

时间:2011-02-16 19:38:16

标签: c

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char a[]="shevchenko ac milan";
printf("%s",&a);
}

这是印刷品“shevchenko ac milan”

but 
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char a[]="shevchenko ac milan";
printf("%s",&a+1);
}

为什么会打印垃圾字符?

4 个答案:

答案 0 :(得分:10)

&a的类型为指向char[20] 的指针。

执行&a+1后,您将转到内存中的下一个char[20]项目,因此您将继续a

您应该改为char*:通过将1加到它上面,您将转到下一个char

要获得char*,您可以使用a(通过执行此操作在char*中衰减),从而a+1转到下一个字符。

答案 1 :(得分:3)

您不需要传递(&a)的地址 - 在C中,字符串是char的数组,因此a已经是一个地址。尝试:

char a[]="shevchenko ac milan"; printf("%s", a);

char a[]="shevchenko ac milan"; printf("%s", a+1); 

答案 2 :(得分:1)

这种情况正在发生,因为当你说&amp; a + 1时。这会使指针到达字符串结尾之前的一个位置。这是指针基本操作。你可以检查这个整数数组也是。

例如

int a[]={1,2,3,4,5};

printf("%d",&a+1);将始终打印垃圾值。

现在 将指向下一个1D数组 ,实际上并不存在。因此打印垃圾值。

答案 3 :(得分:0)

当您递增“指向地址的地址”时,您将获得未分配的值。 fbrereto是对的,你只需要将指针传递给第一个位置,并使用+ 1指向数组中的第二个位置。