字符串内存泄漏的小实验

来源:互联网 发布:linux 机器重启时间 编辑:程序博客网 时间:2024/06/05 08:30

       今天看到字符串的知识点,资料上在计算字符串长度和所占内存时,提到了所占内存比字符串长度要多一个字节,因为字符串末尾有一个不显示的 ‘\0’ 所以字符串长度比所占内存要少一个字节。

       我就想,‘\0’ 是做什么用的,原来 ‘\0’ 是为了以 “%s” 输出字符串时终止输出用的。如果我把字符串以单个字符输出的形式输出呢?

 

    int _tmain(int argc, _TCHAR* argv[])
    {

          char s[] = { "hahahahah" };             //定义一个字符数组s[],把“hahahaha”赋值给s[]

          for (int i = 0; i < 10; ++i)                 //循环输出字符串的单个字符
          {
            printf("%c", s[i]);
          }
    
     return 0;

    }



结果会把 ‘\0’ 以空格的形式输出。

既然可以吧 ‘\0’输出...如果我同时定义两个字符数组,保存两个不同的字符串,取到一个字符数组的地址是不是可以把另一个数组中的字符挨个输出出来?疑问


因为栈内存中变量是向低地址扩展的,意思是先定义的变量地址比后定义的变量要大,所以我应该输出后来定义的数组


int _tmain(int argc, _TCHAR* argv[])
{
    char a[] = {"hello world!"};         //定义一个字符数组a[],把“Hello World!”赋值给a[]
    char s[] = { "hahahahah" };             //定义一个字符数组s[],把“hahahaha”赋值给s[]

    for (int i = 0; i < 60; ++i)         //循环输出字符串的单个字符
     {
            printf("%c", s[i]);
    }
    
    return 0;
}


因为不知道这两个数组的地址间隔多少,所以取了个比较大的值,的确把数组 a[] 的“hello world!” 也输出出来了。


如果我想取一段有用的数据,我不知道这段数据的地址,但是恰好我知道他前面的地址,我该怎么办呢得意

原创粉丝点击