x86上的指针大小和奇怪的字符输出

时间:2018-04-13 15:33:37

标签: c++ string pointers character

#include <iostream>
#define SIZE 2

int main(int argc, char** argv)
{
    char w = 'a';
    char *array[SIZE];
    array[0] = &w;
    std::cout << *array << std::endl;
    system("PAUSE");

    return(0);
}

该计划的输出是:a╠╠╠╠┴Kôè∞≈5«,┌

Char长度为一个字节,因此输出应为:a

或者它输出垃圾,因为x86的指针大小为4个字节(对于int,double,float,char),所有垃圾都是3个字节?

4 个答案:

答案 0 :(得分:4)

char *array[SIZE];

你正在声明一个char指针数组,该数组的每个元素都是一个char *, 然后

char[0] = &w;

您将第0个指针指定为变量w的地址。

std::cout<<*array<<std::endl;

相同
std::cout<<array[0]<<std::endl;

你正在尝试打印第0个指针,你设置的不是以空字符结尾的字符串,当你从内存中读取随机内容时,任何事情都可能发生。

答案 1 :(得分:4)

这与指针大小或内置类型的大小无关。

代码会在array[0]中存储字符的地址,然后将该地址发送到std::cout。将char*插入std::cout时,插入器会假定指针指向以空字符结尾的字符数组。这里没有nul终结符,所以它继续编写东西,直到它达到零。形式上,行为未定义。

使用char* array = &w; std::cout << array << '\n';,您可以更清楚地获得相同的内容。或者,更简单,std::cout << &w << '\n';

要写入字符的值,请使用std::cout << w << '\n';,或者,如果需要使用该数组,请在数组的开头写出字符。那是array[0][0]或者,如果您喜欢直接取消引用,请**array

答案 2 :(得分:3)

  

Char长度为一个字节,因此输出应为:a

“一个字节”的长度尚未存储在已编译程序的任何位置。

指针(如char *)到一个字节与指向多个字节的指针没什么区别。指针不知道。

当您向<{1}}发送字符指针时,该流旨在输出连续的字符,直到遇到空字符。这就是如何确定应该输出多少个字符。指针不知道,因此指向的数据预计会标记它的结束。

答案 3 :(得分:1)

在极少数例外的表达式中使用的数组将转换为指向其第一个元素的指针。

从C ++标准(4.2数组到指针转换)

  

1“N T数组”或“未知数组”的左值或右值   T“的绑定可以转换为”指向T“的类型的prvalue。该   result是指向数组第一个元素的指针。

所以在这个陈述中

std::cout << *array << std::endl;

子表达式array的类型为char **,因为数组的元素的类型为c har *

因此,表达式*array的类型为char *。并且您正在尝试输出指针*array指向的非零终止的字符串。所以程序有不确定的行为。它输出字符'a'后面的所有字符,直到在内存中遇到零字符。

你需要写

std::cout << **array << std::endl;

只输出一个字符。

这是一个示范程序

#include <iostream>

int main() 
{
    const size_t SIZE = 2;
    char w = 'a';
    char *array[SIZE];
    array[0] = &w;

    std::cout << **array << std::endl;  

    return 0;
}

它的输出是

a

本声明

std::cout << *array << std::endl;

如果在对象中的字符'a'之后将有一个零字符,如果该语句将处理字符串,则可以正常工作。

例如

#include <iostream>

int main() 
{
    const size_t SIZE = 2;
    char w[] = { 'a', '\0' };
    char *array[SIZE];
    array[0] = &w[0];

    std::cout << *array << std::endl;   

    return 0;
}

程序输出与上面的shwon相同。