c程序中的指针

时间:2014-02-26 09:27:41

标签: c pointers

用c语言编写程序

void main()      
{
 char *a,*b;    
 a[0]='s';    
 a[1]='a';    
 a[2]='n';    
 a[3]='j';    
 a[4]='i';   
 a[5]='t';   
 printf("length of a %d/n", strlen(a));  
 b[0]='s';  
 b[1]='a';   
 b[2]='n';   
 b[3]='j';   
 b[4]='i';  
 b[5]='t';       
 b[6]='g';      
 printf("length of b %d\n", strlen(b));  
}

这里的输出是:

length of a 6    
length of b 12

为什么,请解释一下。

提前感谢。

6 个答案:

答案 0 :(得分:1)

您正在分配指针(包含垃圾)而不分配内存。你注意到的是Undefined Behavior。另外main应返回int。另外,尝试查找不是nul终止的字符数组的长度是没有意义的。

您可以这样做:

Sample code

答案 1 :(得分:1)

当你声明任何变量时,它会附带运行应用程序的内存中的任何变量,并且因为指针本质上是数字,所以它引用了一些随机存储器地址。

然后,当设置a[i]时,编译器会解释为您要向前移动sizeof(a)个字节,因此a[i]等于地址(a + i*1)(1因为char使用一个字节。)

最后,C字符串需要以NULL结尾(\0,也称为sentinel),像strlen这样的方法会超过字符串的长度,直到命中哨兵,很可能是你的记忆在0的某处导致strlen停止。

答案 2 :(得分:1)

分配一些内存并终止字符串然后它会更好用

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>


    void main(){
            char *a=malloc(10);
            char *b=malloc(10);
            if(a){
                    a[0]='s';
                    a[1]='a';
                    a[2]='n';
                    a[3]='j';
                    a[4]='i';
                    a[5]='t';
                    a[6]=(char)0;   
                    printf("length of a %d\n", (int)strlen(a));
            }else{
                    printf("Failed to allocate 10 bytes\n" );
            }
            if(b){
                    b[0]='s';
                    b[1]='a';
                    b[2]='n';
                    b[3]='j';
                    b[4]='i';
                    b[5]='t';
                    b[6]='g';
                    b[7]=(char)0;   

                    printf("length of b %d\n", (int)strlen(b));
            }else{
                    printf("Failed to allocate 10 bytes\n" );
            }
            free(a);
            free(b);
    }

答案 3 :(得分:0)

未定义的行为。就是这样。

您正在使用未初始化的指针。之后,所有投注都将结束。

当然,我们可以尝试解释为什么你的特定实现以某种方式起作用,但除了新颖之外它是毫无意义的。

答案 4 :(得分:0)

索引操作符解除引用指针ab,但您从未初始化这些指针以指向有效内存。写入未初始化的内存会触发未定义的行为。

你只是“幸运”(或者说运气不好,这取决于你的观点)程序不会崩溃,指针值是你在这些位置成功写的。

请注意,您永远不会将终止字符('\0')写入任一字符串,但仍会从strlen()获取“正确”值;这意味着ab都指向恰好充满零的内存。更幸运。

这是一个非常破碎的计划;它设法“成功”运行是因为它的行为是 undefined ,而undefined明确包含“作为程序员的意图”。

答案 5 :(得分:0)

ab都是char指针。首先,你没有初始化它们,其次没有用NULL终止它们。