2016-09-30 2 views
-1

У меня возникли проблемы с передачей массива, хотя exec. Я могу только когда-либо получить первый элемент после его прохождения. Я знаю, что указатель указывает только на голову, но остальное должно быть в непрерывной памяти.Проблема с доступом к массиву, прошедшему через execlp

//runner 
int nums[10]; 
int* nums1=malloc(10*sizeof(int)); 
nums1=nums;//I know it's redundant 
... 
execlp("mean","mean",nums1,(char *)NULL); 

//Mean.c main 
int nums[10]; 
*nums=argv[1][0]; 

Остальная часть программы сумм, в цикле, значения НУМС, и делится на 10 для среднего значения.

Это дает мне первый элемент правильно в среднем, а остальное мусор, когда я пытаюсь пробежать числа. Я пробовал все, о чем я могу думать (* nums + i, nums [i]) и не могу понять, что вызывает ошибку. Число занятых заполняется правильно, но независимо от того, как я пытаюсь получить доступ к массиву после прохождения, мне дается только то, что я определил, это argv [1] [i], и все, что прошло мимо i = 0, не определено. То есть

10 0 4196061 0 0 0 0 0 4195984 0 

против

10 3 5 6 33 23 2 3 3 4 
+0

Ваша '// я знаю, что это избыточная строка на самом деле * хуже *, чем избыточная. Это утечка памяти, потому что вы не 'free', что вы' malloc''d раньше! Кроме того, я не понимаю, почему вы определяете 'nums1' вообще, когда вы явно используете его как дополнительное имя для nums. – Jesin

+1

'execlp' - это функция с переменными аргументами, также называемая эллипсом. Вы не можете развернуть массив в несколько аргументов эллипса. Если вы хотите иметь параметры в массиве и хотите передать массив в целом, тогда вы должны использовать 'execvp'. Обратите внимание, что 0-й элемент массива - это то, что передается как 'argv [0]' (в большинстве случаев такое же, как и путь), а последний элемент массива * должен * быть NULL. – Pablo

+3

Также аргументы должны быть строками C! Просто потому, что вы не получаете предупреждение о компиляторе (из-за вариационной функции), это не значит, что ваш код правильный. Прочтите man-страницу функций, которые вы используете! Возможно, вы сначала хотите правильно изучить основы, прежде чем возиться с процессами и т. Д. – Olaf

ответ

0

Как Olaf отметил в comment, вы можете передать только массив строк в другой программе.

Кроме того, с execlp() размер массива должен быть известен при компиляции программы запуска; исправлено количество аргументов, которые могут быть переданы с execlp(). Если вы хотите передать неизвестное или переменное количество аргументов, вы должны вместо этого использовать execvp(). Для этого требуется набор указателей с нулевым символом для строк.

В контексте, это может означать:

int num_values = 10; 
int nums[10] = { …appropriate initialization… }; 

char **argv = malloc((num_values + 2) * sizeof(*argv)); 
if (argv != 0) 
    …report error…abandon ship… 

argv[0] = "means"; 
for (int i = 0; i < num_values; i++) 
{ 
    argv[i+1] = malloc(20); // Big enough for 64-bit signed integer 
    if (argv[i+1] == 0) 
     …report error…maybe free memory…abandon ship… 
    snprintf(argv[i+1], 20, "%d", nums[i]); 
} 
argv[num_values+1] = NULL; 
execvp(argv[0], argv); 
…report error…abandon ship… 

Процесс «покинуть корабль», вероятно, exit(EXIT_FAILURE); или аналогичная операция - как правило, вы раздвоенный дочерний процесс, чтобы запустить другую программу, и нет ничего для ребенка, если он терпит неудачу. Если вы не разветвлены, и вы вернетесь к другому коду, вам нужно очистить выделенную память перед возвратом из функции.

Обратите внимание, что исполняемая программа должна преобразовать строки обратно в целые числа перед обработкой результата.

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