用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
为什么,请解释一下。
提前感谢。
答案 0 :(得分:1)
您正在分配指针(包含垃圾)而不分配内存。你注意到的是Undefined Behavior。另外main
应返回int
。另外,尝试查找不是nul
终止的字符数组的长度是没有意义的。
您可以这样做:
答案 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)
索引操作符解除引用指针a
和b
,但您从未初始化这些指针以指向有效内存。写入未初始化的内存会触发未定义的行为。
你只是“幸运”(或者说运气不好,这取决于你的观点)程序不会崩溃,指针值是你在这些位置成功写的。
请注意,您永远不会将终止字符('\0'
)写入任一字符串,但仍会从strlen()
获取“正确”值;这意味着a
和b
都指向恰好充满零的内存。更幸运。
这是一个非常破碎的计划;它设法“成功”运行是因为它的行为是 undefined ,而undefined明确包含“作为程序员的意图”。
答案 5 :(得分:0)
a
和b
都是char
指针。首先,你没有初始化它们,其次没有用NULL
终止它们。