程序崩溃函数原型声明

时间:2013-09-17 16:31:04

标签: c crash memcpy function-prototypes

我尝试练习写这个函数的泛型函数:

void *scramble(void *arr, int ElemSize, int n, int *indArr); 但每当我使用调试器运行程序时,它会在原型行上崩溃,使用F11(Step Into)我会看到以下内容:

1

#else  /* WPRFLAG */
            __initenv = envp;
            mainret = main(argc, argv, envp);
#endif  /* WPRFLAG */

2

if ( !managedapp )
    exit(mainret);

然后控制台消息说:The program '[8108] 1.exe: Native' has exited with code 0 (0x0).

这是我的程序(请忽略逻辑编码错误,因为我想自己解决它):

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

typedef char BYTE;

void *scramble(void *arr, int ElemSize, int n, int *indArr);

void main()
{
    int indArr[5]={5,4,3,2,1};
    int numbers[5]={1,2,3,4,5};
    char letters[5]={'a','b','c','d','e'};

    int *newNum;
    char *newLet;

    newNum = (int*)scramble(numbers, sizeof(int), 5, indArr);
    newLet = (char*)scramble(letters, sizeof(char), 5, indArr);
}

void *scramble(void *arr, int ElemSize, int n, int *indArr)
{
    int i;
    BYTE *read, *write;
    void *res;

    res = malloc(ElemSize*n);

    write = (BYTE*)res;
    read = (BYTE*)arr;

    for (i = 0; i < n; i++)
    {
        memcpy(write + indArr[i]*ElemSize, read, ElemSize);
        read += ElemSize;
    }

    return res;
}

2 个答案:

答案 0 :(得分:0)

如果您查看memcpy行:

memcpy(write + indArr[i]*ElemSize, read, ElemSize);

indArr[0] inAddr[0] = 5的目的地不正确。考虑内存是一个连续的块,指针write指向开头。添加5 * ElemSize进行写入将使其超出所分配内存的范围。

 _______________________
|    |    |    |   |    | 1
 -----------------------
^- write                 ^- write + 5 * ElemSize

答案 1 :(得分:0)

OP使用的是基于1的索引而不是基于0的索引。这导致第一个memcpy写入外部边界。更改代码如下。

// int indArr[5]={5,4,3,2,1};
int indArr[5]={4,3,2,1,0};

[编辑]

@Freddie&amp; amp;我没能复制OP的问题。 OP发布的“崩溃”之后的两个步骤是正常退出之前的正常步骤。无论是陈述的是错误还是OP的调试器/编译器只是“知道”它不需要打扰那些讨厌的scramble()函数调用,并且可以早点回到Bill的家里。