2015-06-20 2 views
-2

Я изучаю C, и я просто перешел через раздел указателей. В книге было предложено написать программу, которая объединяет два массива в один массив, передавая указатель на функцию. Я прошел через код, и все это выглядит нормально для меня, но почему-то результат дает смешанные результаты. Может кто-нибудь сказать мне, если что-то не так.Добавить программу Array не работает

// 
// main.c 

#include <stdio.h> 
#include <unistd.h> 

int *AddArrays(int *A, int *B, int a, int b); 

int main(void) 

{ 
    int A[5] = {1,2,3,4,5}; 
    int B[7] = {6,7,8,9,10,11,12}; 
    int a = 5; 
    int b = 7; 
    int c = a + b; 
    int x = 0; 
    int NewArray[c], *ArrayPtr; 

    ArrayPtr = AddArrays(A,B,a,b); 

    for(x = 0; x < c; x++) 
    { 
     *(NewArray + x) = *ArrayPtr; 

     printf("Value of NewArray[%d] = %d\n", x, *(NewArray+x)); 
     sleep(1); 

     ArrayPtr++; 
    } 


    return 0; 
} 

int *AddArrays(int *A, int *B, int a, int b) 
{ 
    int c; 
    int d; 
    int NewArray[a+b]; 

    for (c = 0; c < a; c++) 
    { 
     NewArray[c] = *A; 
     A++; 

    } 

    for (d = 0; c < d; d++) 
    { 
     NewArray[a] = *B; 
     a++; 
     B++; 
    } 

    return NewArray; 
} 

Примечания: Я не думаю, что есть необходимость в использовании таНоса(), так как размер массива указан и новый размер массива явно объявлен.

Бонус Вопрос: есть ли способ, чтобы функция динамически реагировала на типы массивов. Прототип функции предназначен только для целых чисел и возвращает указатель типа «int». Это просто вопрос добавления этого странного преобразования (типа) infront переменной?

+3

Что вы обнаружили, когда вы запускали этот код в своем отладчике? –

+0

Он был успешно выполнен, но выход не распечатывал массив «A» с добавлением к нему «B». Вместо этого он печатает «1», «2», а затем случайные числа, а затем «0» для последних значений ячейки массива. – JCodder

+1

Это не выход отладчика. Также обратите внимание, что это не соревнование. Не существует «необходимости» для вопроса _bonus. (если вы считаете, что типы на самом деле «привязаны»), вы должны перечитать главу о типах и о парадигмах программирования. – Olaf

ответ

0

В вашей второй петле в AddArray вы хотите d < b вместо c < d. Второй цикл никогда не выполняется так же, как и потому, что d начинается с нуля, а c всегда будет больше нуля после первого цикла.

+0

спасибо. Я понял, что мне нужно сделать массив статическим в функции, но он не позволит мне, так как он имеет переменную длину. Я перепрограммировал программу и изменил длину NewArray на [12] в функции и сделал его статическим. Программа выполнена хорошо, за исключением того, что B был добавлен неправильно. Ваш ответ решает эту проблему, но все же я не знаю, как сделать его статическим в функции. – JCodder

+0

Извините, после компиляции кода я «Я понимаю вашу проблему в два раза.Вы возвращаете локальную переменную NewArray внутри AddArray, это не гарантируется ничем после выполнения NewArray, поэтому вы видите странный вывод. Вероятно, вы должны передать указатель на конечный массив, который хотите скопировать в AddArray, и записать в него, вместо того, чтобы функция возвращала что-либо. – dimet

+0

Большое вам спасибо! В этом есть смысл. Я попробую добавить аргумент указателя. – JCodder

2

является Причина использования malloc.

Это утверждение:

return NewArray; 

возвращает указатель на первый элемент массива. Но вы объявили массив в стеке (т. Е. Не динамически, без malloc), поэтому, как только элемент управления выходит из функции, массив выходит из области действия и больше не является безопасным для использования. Ваше использование этого позже вызывает неопределенное поведение, и вам повезло, если все, что вы получаете, это случайные числа.

Изготовление статическое не является хорошим решением. Во-первых, это означает, что вы можете использовать эту функцию только один раз - если вы вызовете ее снова, она перепишет массив содержимым своих новых аргументов, и результаты предыдущего вызова будут изменены таким образом, чтобы вы почти конечно, не намерены.

Вы также можете объявить за пределами функции и передать указатель на нее; выбор между двумя проектами зависит от обстоятельств, но если вы пытаетесь изучить язык, я бы посоветовал вам попробовать оба.

+0

Спасибо! Я сделал второе решение, и он закончил работу в соответствии с предложением других плакатов. Если бы я использовал malloc(), я бы выделил пространство для массива внутри функции? Тогда это также решит проблему и сохранит значения массива из временной локальной области? – JCodder

+0

@JCodder: Да, и да. Не забывайте, что код, который вызывает 'AddArrays', принимает ответственность за удаление массива, когда он больше не нужен. (Это хорошая практика, а не строгое требование к языку.) И для вашего «Бонусного вопроса» загляните в * шаблоны. * – Beta

+0

@beta: "templates"? Это C, а не C++. – Olaf