char* 打印 乱码

C、C++和Java语言
回复
qq_771365380
帖子: 11
注册时间: 2017-04-08 22:13
系统: Ubuntu16.04
送出感谢: 1 次
接收感谢: 0

char* 打印 乱码

#1

帖子 qq_771365380 » 2018-01-29 22:30

代码: 全选

#include <unistd.h>
#include <string.h>
#include <iostream>
using std::cout;
using std::endl;
#include <cstdio>
using std::printf;

/*
  方法作用获取并打印当前路径
*/
int main()
{
  int array_length = 10;
  char *get_current_path_result = NULL;
  do
  {
    array_length += array_length/2;
    char buf[array_length];
    get_current_path_result = getcwd(buf,sizeof(buf));
    
    if(get_current_path_result != NULL)
    {//如果注释掉 if 语句块 main 方法末尾的 printf 语句会打印乱码
      printf(" %s \n", get_current_path_result);      
    }
  }
  while (get_current_path_result == NULL);

  printf(" %s \n", get_current_path_result);
}
问题如上
qq_771365380
帖子: 11
注册时间: 2017-04-08 22:13
系统: Ubuntu16.04
送出感谢: 1 次
接收感谢: 0

Re: char* 打印 乱码

#2

帖子 qq_771365380 » 2018-01-30 9:25

最新的动态是:
有时候 不 注释 if 语句块 打印出来也是乱码(频率极低)
qq_771365380
帖子: 11
注册时间: 2017-04-08 22:13
系统: Ubuntu16.04
送出感谢: 1 次
接收感谢: 0

Re: char* 打印 乱码

#3

帖子 qq_771365380 » 2018-01-30 17:39

关于为什么要写这个循环,是为了节省内存(用时间换空间),暂不讨论这么做是否有意义(意义有多大)

最新的理解while语句块中得到的文件地址,存放在 buf 数组中 ,get_current_path_result所指向的也正是该数组
在while循环结束后,buf 数组所在的内存处于可释放状态,所以此时我们调用打印改指针所指向的内存中的内容会出现不可预知的结果(这正符合试验现象,打印的结果不确定,有时候携带部分有意义的信息,但是该信息不可靠)

这也解释了有时候即使不注释 if 语句块打印的结果也存在乱码

这个时候我们应该是需要动态分配内存的知识了

new delete malloc free
qq_771365380
帖子: 11
注册时间: 2017-04-08 22:13
系统: Ubuntu16.04
送出感谢: 1 次
接收感谢: 0

Re: char* 打印 乱码

#4

帖子 qq_771365380 » 2018-01-30 17:42

qq_771365380 写了:关于为什么要写这个循环,是为了节省内存(用时间换空间),暂不讨论这么做是否有意义(意义有多大)

最新的理解while语句块中得到的文件地址,存放在 buf 数组中 ,get_current_path_result所指向的也正是该数组
在while循环结束后,buf 数组所在的内存处于可释放状态,所以此时我们调用打印改指针所指向的内存中的内容会出现不可预知的结果(这正符合试验现象,打印的结果不确定,有时候携带部分有意义的信息,但是该信息不可靠)

这也解释了有时候即使不注释 if 语句块打印的结果也存在乱码

这个时候我们应该是需要动态分配内存的知识了

new delete malloc free
或者对象拷贝(在数据被被销毁之前将其拷贝出来)
qq_771365380
帖子: 11
注册时间: 2017-04-08 22:13
系统: Ubuntu16.04
送出感谢: 1 次
接收感谢: 0

Re: char* 打印 乱码

#5

帖子 qq_771365380 » 2018-01-30 19:45

这段代码就可用了

代码: 全选

#include <unistd.h>
#include <string.h>
#include <iostream>
using std::cout;
using std::endl;
#include <cstdio>
using std::printf;

/*
  方法作用获取并打印当前路径
*/
int main()
{
  int array_length = 10;
  std::string result = "";
  
  do
  {
    array_length += array_length/2;
    char buf[array_length];
    if(getcwd(buf,sizeof(buf)) != NULL)
    {
      result = buf;
    }
  }
  while (result.empty());

  cout << result << endl;
}
头像
bzimage
帖子: 675
注册时间: 2006-03-14 10:25
送出感谢: 1 次
接收感谢: 5 次

Re: char* 打印 乱码

#6

帖子 bzimage » 2018-01-30 23:31

你的char buf[array_length]是定义在do while 的两个大括号之间的局部变量,其生命周期就是在这两个大括号之间,在do while 循环结束后再去饮用它,就会出错。
这些用户感谢了作者 bzimage 于这个帖子:
qq_771365380 (2018-01-31 18:09)
评价: 3.7%
回复

回到 “C/C++/Java”