2013-09-17 2 views
-1

я стараюсь практиковать общие функции написания этой функции:Программы сбой на объявлении функции прототипа

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

Проводка кода, который вызывает 'scramble', поможет. – chux

+0

@chux, я отредактировал и добавил весь код – Quaker

+0

Ваш первый вызов 'memcpy (write + indArr [i] * ElemSize, read, ElemSize)' is 'memcpy (write + 5 * ElemSize, read, ElemSize);' , Похоже, что это вне 'write'. Я думаю, вы хотите 'int indArr [5] = {4,3,2,1,0}'. (Индексирование с нулевым индексом) – chux

ответ

0

Если вы посмотрите на memcpy линия:

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

назначения не является правильным для indArr[0] если inAddr[0] = 5. Подумайте, что память является смежным блоком, а указатель write указывает на начало. Добавление 5 * ElemSize для записи выведет его за пределы выделенной памяти.

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

Как я уже упоминал в комментариях, это была логическая ошибка, и она уже исправлена. Даже после его исправления программа отказывается работать под отладчиком Visual Studio. – Quaker

+0

Вы поставили точку останова? – Freddie

+1

, конечно ... он не проходит мимо линии прототипа – Quaker

0

ОП использовал 1-индексирование, а не индексацию на основе 0. Это заставило первую memcpy писать внешние границы. Измените код, как показано ниже.

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

[Редактировать]

Дальнейшие исследования с @Freddie & мне не удалось воспроизвести проблему OP еще. 2 шага после «аварии», отправленного OP, являются обычными шагами перед нормальным выходом. Либо что-то заявленное, либо неверно, либо отладчик/компилятор OP просто «знал», что ему не нужно беспокоиться об этих досадных scramble() вызовах функций и может рано вернуться домой к дому Билла.

+1

Это не решает вопрос ОП. – Quaker

Смежные вопросы