相关疑难解决方法(0)

可以在其范围之外访问局部变量的内存吗?

我有以下代码.

#include <iostream>

int * foo()
{
    int a = 5;
    return &a;
}

int main()
{
    int* p = foo();
    std::cout << *p;
    *p = 8;
    std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)

而代码只是运行而没有运行时异常!

输出是 58

怎么会这样?本地变量的内存不能在其功能之外无法访问吗?

c++ memory-management local-variables dangling-pointer

990
推荐指数
19
解决办法
26万
查看次数

数组索引在C中超出范围

为什么C在数组索引超出限制的情况下进行区分

#include <stdio.h>
int main()
{
    int a[10];
    a[3]=4;
    a[11]=3;//does not give segmentation fault
    a[25]=4;//does not give segmentation fault
    a[20000]=3; //gives segmentation fault
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,它正在尝试访问分配给进程或线程的内存,如果是a[11]或者a[25]它正在超出堆栈边界a[20000].

为什么编译器或链接器没有出错,他们不知道数组大小?如果没有,那么如何sizeof(a)正常工作?

c c++ arrays

44
推荐指数
3
解决办法
5万
查看次数

没有出界错误

我在C中有这个代码,它接受了一堆chars

#include<stdio.h> 
# define NEWLINE '\n'
int main()
{

char c;
char str[6];
int i = 0;
while( ((c = getchar()) != NEWLINE))
{
        str[i] = c;
        ++i;
        printf("%d\n", i);
}

return 0;
}
Run Code Online (Sandbox Code Playgroud)

输入是:testtesttest

输出:1 2 3 4 5 6 7 8 117 118 119 120

我的问题是:

  1. 虽然我明显超出了阵列的容量,为什么我不会出现超出界限(分段错误)的异常?

  2. 为什么输出中的数字会突然跳到很大的数字?

我在C++中试过这个并且得到了相同的行为.请问有谁可以解释一下这是什么原因?

c indexoutofboundsexception

12
推荐指数
2
解决办法
2万
查看次数

为什么编译或运行时不会抛出错误

int main()
{
    int a[2] = {1,2};
    a[2] = 3;
    printf("\n\n%d  %d  %d\n\n",a[0],a[1],a[2]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我输出为 1 2 3

为什么在运行时或编译时没有抛出错误?

c arrays

1
推荐指数
1
解决办法
134
查看次数