![](/img/trans.png)
[英]Why does string (const char* s, size_t pos, size_t len = npos) work?
[英]Debug why does size_t not work as a data member?
有人可以告訴我為什么第一個程序崩潰,而第二個卻沒有嗎? 第一個(崩潰):
#include <cstdlib>
class test
{
public:
test(const char *cstr)
{
size_t j=0;
while(cstr[n++])
;
//n = j;
}
private:
size_t n;
};
int main()
{
test("Hello, world!\n");
return 0;
}
第二個不會崩潰(使用構造函數局部變量而不是數據成員計數):
#include <cstdlib>
class test
{
public:
test(const char *cstr)
{
size_t j=0;
while(cstr[j++])
;
n = j;
}
private:
size_t n;
};
int main()
{
test("Hello, world!\n");
return 0;
}
在Windows上運行MinGW。 make: * [run]錯誤-1073741819
很簡單,因為在您的第一個示例中,構造n
在初始化之前就使用了n
(實際上, n
從未被初始化)。
所以線
while(cstr[n++])
是未定義的行為。
嘗試:
test(const char *cstr) : n(0) // <-- initialize n
{
size_t j=0;
while(cstr[n++])
;
//j = n;
}
在第一種情況下,您使用未初始化的n
,這就是程序崩潰的原因,這是未定義行為(UB)的可能性之一。 使用未初始化的變量將調用UB。
test(const char *cstr)
{
size_t j=0; //<--- here you want to do : n = 0;
while(cstr[n++])
;
//j = n;
}
或者更好的是,您應該將member-initialization-list用作:
test(const char *cstr) : n(0)
{ //^^^^^^ it is member-initialization-list
while(cstr[n++]) ;
}
確保cstr
是以null終止的字符串,否則您的代碼仍將包含UB。
第一個示例中的私有成員size_t n從未初始化。 其值是不確定的。 在您的while循環之前添加n = 0,它應該可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.