我尝试练习写这个函数的泛型函数:
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;
}
答案 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的家里。