当我尝试找出字符串的长度时,Sizeof 是一个负数

Posted

技术标签:

【中文标题】当我尝试找出字符串的长度时,Sizeof 是一个负数【英文标题】:Sizeof is a negative number when I try to find out the length of a string 【发布时间】:2014-10-26 13:05:34 【问题描述】:

在我的代码中,我一直在尝试在字符串数组中查找特定字符串的长度。但是,当我这样做时,无论我尝试用什么方法查找特定字符串的长度,总是返回 -858993460

我一直在使用的代码是

void drawChoices(int x, std::string s [], int iChoice)

    setCurPos(x, 1); //this function just sets the console cursor
    for (int i = 0; i <= iChoice; i++)
    
        color(15, 4); //this function just sets the console color
        std::cout << "[" << s[i] << "]";
        color(8, 8);
        int asfa = sizeof s[i]; //this is the one causing trouble
        std::cout << " \n";
    

我尝试使用sizeofstring::lengthstrlen 在数组中查找字符串的长度,但结果相同。

【问题讨论】:

你是如何确定 asfa 有这个负值的? -1 提供的代码没有说明所声称的行为(负大小)。 当您使用 Visual C++ 时,-858993460 是一个神奇的数字。转换成十六进制,就是0xcccccccc。这是在 Debug 构建中初始化所有变量的值。每当你在调试时看到它,你就会去“啊,我正在使用一个未初始化的变量!”让调试器告诉你哪一个是问题,你的 for(;;) 循环中的一个错误是值得注意的。 -858993460 = 0xCCCCCCCC 这意味着you've accessed uninitialized memory 【参考方案1】:

您永远无法使用sizeof 获得字符串的长度。 sizeof 运算符在编译时计算并返回类型或变量的大小。您对sizeof 的使用是:

sizeof s[i]

由于s[i] 具有std::string 类型,因此该表达式的计算结果为您的实现std::string 的大小。但这是在编译时确定的,因此不依赖于缓冲区的内容,您根本没有兴趣知道。

使用std::string::size() or std::string::length() 获取std::string 的长度。

所以,在你的代码中你会使用

s[i].length()

获取字符串s[i]中的长度,即字符元素的个数。另请注意,可互换的 size()length() 方法返回您应该使用的 std::string::size_type 而不是 int

至于负值从何而来,我们不能说。您的代码不会输出 sizeof 产生的值,在任何情况下都不会是负数。

你的循环真的应该是

for (int i = 0; i <= iChoice; i++)

而不是

for (int i = 0; i < iChoice; i++)

与其传递并可能存储std::string 的数组,不如使用 C++ 容器更符合习惯。在这种情况下std::vector&lt;std::string&gt;

【讨论】:

@David Heffernan s[i] 具有 std::string 类型,其大小即使放在 int 类型的对象中也不能为负数。:) 感谢您的评论,但还是不行。正如我在帖子中所说,我已经尝试过std::string::length。但是,我确实将intsize_t 交换,但这产生了一个很大的正数。另外,对于您的其他建议,我发现这很有用,因此我不必每次使用参数调用函数时都减去一个。谢谢。 没有。众所周知,lengthsize 运行良好。 strlen 用于 C 字符串,sizeof 用于此应用程序是错误的。我无法评论您的未初始化值,因为我看不到您的代码。【参考方案2】:

从@VladfromMoscow 提到的内容来看,我已经找到了问题所在。

问题是当我使用 Visual Studio 2013 的调试和本地窗口时,我在变量初始化的同时进行调试。

随着本地窗口编译行的顺序以及 Visual Studio 的调试工作方式,它会给出一个随机数,因为变量没有被初始化。

它首先读取size_t asfa,停止它,本地窗口获取该值,然后在我继续它时执行s[i].length();

我认为这将是程序的错误,因为我尝试输出 std::cout &lt;&lt; asfa;,但我记得你不能直接将 intsize_t 转换为字符串,而无需强制转换或转换。感谢所有帮助过的人。

【讨论】:

以上是关于当我尝试找出字符串的长度时,Sizeof 是一个负数的主要内容,如果未能解决你的问题,请参考以下文章

C++ length()、size()、sizeof()三者的区别

strlen与sizeof

Strlen()与Sizeof()的区别

当我尝试使用负边距向上移动图像时,整个容器向上移动

strlen sizeof strcat strcpy区别

c语言求数组长度strlen