【问题标题】:Error: derefferencing out of bounds pointer错误:取消引用越界指针
【发布时间】:2019-05-31 00:02:25
【问题描述】:

鉴于以下代码,我在运行时收到以下错误

致命的运行时错误:第 21 行,第 11 列,线程 id 0x00002068:
越界指针的取消引用:1 个字节(1 个元素)超过 数组。

我在这里做错了什么?我创建了一个 2D 字符数组并将所有元素初始化为“x”。然后我尝试使用指针逻辑打印所有元素。它将字符打印到标准 IO,但随后引发运行时错误。我没有看到越界发生在哪里。

#include <stdio.h>
#define EDGE 10

int main(void){

    char fabric[EDGE][EDGE];
    char *cell = fabric;
    int totalCells = EDGE*EDGE;

    for(int i = 0; i < totalCells; ++i){    
            *(cell + i) = 'x';
    }

    cell = fabric; //set cell to point back to first element

    while(*cell){                  //while there is content at address, print content
        printf("%c", *cell);
        ++cell;
    }

    getchar();
    return 0;

}

【问题讨论】:

  • char *cell = fabric; 是一个错误,如果您没有看到错误消息,请调整您的编译器设置,直到看到为止。
  • while(*cell) //while there is content at address 评论错误。应该是// while cell points to a non-zero byte。如果fabric 中没有零字节,则超出范围。
  • cell[i] = ... 等效且更易于阅读时,不要使用*(cell + i) = ...。但是,在您的情况下,您有一个 二维数组,因此您应该引用 fabric[i][j].
  • 如果数组表示法导致堆栈溢出,从算法的角度来看,你做错了。您不需要使用指针。指针只会使事情复杂化。 1000 个条目是微不足道的。
  • 对于那种运行时系统可以生成这种诊断的编译器,假设您可以像处理一个大数组[] wad 一样处理数组[][] 是非常冒险的。您可能会覆盖诊断用来检测溢出的故意保护空间。请务必使用名称标记有关此编译器的问题,例如 [labwindows]

标签: c


【解决方案1】:

强烈建议您只使用 malloc/memset 您的结构,而不是做 hacky 指针的事情。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define EDGE        ( 10 )
#define TOTAL_CELLS ( EDGE * EDGE )

int main()
{
    int i;
    char * fabric = malloc(TOTAL_CELLS);
    memset(fabric,'x',TOTAL_CELLS);


    for(i=0; i<TOTAL_CELLS; i++){
        printf("%c",fabric[i]);
    }

    return 0;
}

如果您仍想引用 2D 类数组结构 (fabric[i][j]),您可以在 1D 数组中同样轻松地执行此操作 (fabric[i*EDGE+j]),并且更容易操作该线性内存块。

【讨论】:

    【解决方案2】:

    首先数组不包含字符串。所以这个条件

    while(*cell){ 
    

    导致未定义的行为。

    您还必须在声明和语句中转换指针

    char *cell = ( char * )fabric;
    
    cell = ( char * )fabric;
    

    因为没有从char ( * )[EDGE] 类型到char * 类型的隐式转换。

    【讨论】:

    • @tadman 此声明 char *cell = &fabric;完全不正确。
    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2017-08-18
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2015-03-22
    相关资源
    最近更新 更多