时月oe 2019-11-03 10:09 采纳率: 50%
浏览 241
已采纳

关于字符数组剩余空间分配的问题

小白先上代码

#include<iostream>
using namespace std;
//设计函数返回字符串的前n个字符
char* re(const char* str,int n = 1);
int main()
{
    const char* p = "hello world";
    cout << re(p,100) << endl;

    return 0;
}
char* re(const char* str,int n)
{
    if(n < 0)
        n = 0;//防止用户输入负数
    char* p = new char [n + 1];
    for(int i = 0;i < n && str[i];i++)
        p[i] = str[i];
    p[n] = '\0';//这里我把最后一个元素的值设置为0
    return p;
}

在上面的re函数中,我把新建的数组p的最后一个元素设置为0,可是当str数组很短,并且我传入的n很大的时候,p数组中就会有剩余空间,他们的数值是未知的,但是为什么程序可以正常运行,不会出错呢?(比如面的程序正常输出hello world)

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-11-03 10:43
    关注
    这个随机的,可能正好 p[strlen(str)] 是 '\0'
    对于c语言这种简陋而且原始的语言(缺乏语法和运行时检查)来说,记住一条:程序没写对,未必就报错,程序报错一定是不对。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器