這個問題在這里已經有了答案: 空終止字串的基本原理是什么? (20 個答案) 3 天前關閉。
我是C的新手,最近遇到了這個問題。
我有兩段代碼:
#include <stdio.h>
#include <string.h>
int main()
{
char x = 'a';
// char *y=&x;
printf("%ld\n", strlen(&x)); // output: 1
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
char x = 'a';
char *y=&x;
printf("%ld\n", strlen(&x)); //output: 7
return 0;
}
當我添加改變結果的變數 y 時到底發生了什么?
uj5u.com熱心網友回復:
正如其他人所說,您不能在單個字符上使用 strlen,因為不能保證空終止符。
在第一種情況下,您很幸運,在堆疊映射中“a”后跟一個空位元組。
在第二種情況下,可能由于變數 y 的定義,'a' 后跟六個非零位元組,然后是一個空值。
請注意,這只是一個假設。除錯或發布版本的行為可能不同。這種不穩定現象是不希望的記憶體訪問的典型表現。
uj5u.com熱心網友回復:
strlen()期望作為其引數的字串。C 中的字串是一系列char以空字符結尾的 s。
您的變數x只是一個沒有終止空字符的字符。它不是 的有效引數strlen()。因此,該行為是危險且未定義的。
uj5u.com熱心網友回復:
該代碼觸發未定義的行為。
不可能很好地推理它,因為無論發生什么都會發生。它可能會將單字符變數視為字串,并讀取下一個位元組以查找終止符。
由于該位元組實際上不在有效變數中,因此行為未定義,任何事情都可能發生。不要這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537266.html
標籤:C功能指针字符字符串.h
上一篇:傳遞對抽象類物件的參考
