2016-02-04 2 views
1

Я пытаюсь выделить достаточное пространство для хранения всех аргументов командной строки, заданных для массива arg_list в обратном порядке.C: Malloc String Array Confusion

char* arg_list[6]; 
arg_list = malloc((sizeof(char*)) * argc); 
for (i=argc; i < 0; i--) 
{ 
    arg_list[i]=argv[i]; 
} 

Моя теория была на malloc, чтобы получить sizeof в char*, а затем умножить на сколько аргументы, которые были даны, argc давая общий объем пространства, необходимого.

Затем, используя цикл, начните i на количество элементов, argc, скажем, 5, например, а затем положить 5-й элемент argv в 5-е место в arg_list и делать это до тех пор, пока он получает 0.

Я получаю предупреждения от incompatible implicit declaration и об ошибке assignment to expression with array type и не знаю, где я ошибся. Кроме того, я использую C около полутора лет, так что неважно, как можно больше! Я бы очень признателен!

EDIT: Проблема Распечатка обращенно массива Код:

char** arg_list = malloc((sizeof(char*)) * argc); 

/** arg_list points to the command-line arguments in the */ 
/**  reversed order */ 
for (i=argc-1; i >= 0; i -=1) 
{ 
    arg_list[i]=argv[i]; 
} 

/** print the content of arg_list */ 
/** fill here */ 
for (i=0; i<argc; i++) 
{ 
    printf(arg_list[i]); 
    printf("\n"); 
} 

Я запутался, как я бы идти о печати обратном порядке. Всякий раз, когда я печатаю его, он печатает в обычном порядке, а не наоборот. Я смущен тем, как он попадает в arg_list в обычном порядке, а не наоборот. Благодаря!

+0

Shoudn't ваша петля будет 'for (i = argc - 1; i> 0; i -)', так как вы отсчитываете? – Figaro

+0

Что было бы полезно, поскольку у вас уже есть эти данные? – Olaf

+0

@Olaf Я хочу изменить порядок 'argv' в' arg_list'. Это просто учебное упражнение – Bob

ответ

1

Я отвечаю на отредактированную версию, которая уже включает в себя поправку с других ответов и комментариев.

Lean назад и посмотреть на

for ... 
    arg_list[i] = argv[i]; 

Таким образом, вы назначаете указатель на позицию [i] к указателю на позиции [i]:

arg_list[argc-1] = argv[argc-1]; 
... 
arg_list[1] = argv[1]; 
arg_list[0] = argv[0]; 

Теперь подумайте, что обратный средства .. .

Постарайтесь следовать за мной.Если вы закончите (успешно или нет), напишите комментарий, и я предоставил полное решение. Но сначала попробуйте, это очень просто, и это поможет вам гораздо больше, чем полностью представленное решение.


Разрешения: Вы должны индексировать как массивы из различных направлений:

for (int i = 0 ; i < argc ; i++) 
    arg_list[i] = argv[ argc - 1 - i]; 

я изменил петлю для более очевидной петли Инкрементирования, A S направление не имеет значения.

Обратите внимание, что индекс верхнего входа является argc - 1, не argc, как и в C - как и в большинстве языков программирования - указатели запуск от 0.


Предупреждения: При печати переменных данных, которые вы всегда должен использовать форматированную строку для printf & семьи. Это становится обязательным при отправке внешних данных, таких как аргументы командной строки. Неспособность широко открыть отверстие безопасности. Подумайте о том, чтобы поставить %s в качестве аргумента. Это фактически приводит к:

printf("%s"); 

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

+1

Awwwww 'arg_list [argc-i]' теперь я вижу !!! !!! – Bob

+0

Я ценю всю вашу помощь! – Bob

+1

@Bob: Добро пожаловать. Хорошо, что вы это видели. Имейте это в виду для следующей проблемы: попробуйте запустить код в голове, когда у вас есть проблема. Или в отладчике. Я добавил решение для завершения моего ответа (не уверен, что должен, но я думаю, что это лучше для полноты). Обратите внимание, что вы отключены одним (что является очень типичной ошибкой) в вашем комментарии! Не стесняйтесь использовать пальцы или что-то, что поможет вам отслеживать индексы и т. Д. – Olaf

1

Вы хотите char **arg_list;

Кроме того, для argc элементов, максимальный индекс является [argc - 1], так что вы хотите, чтобы настроить эту петлю.

2

После того, как вы объявили

char* arg_list[6]; 

вы не можете назначить ничего arg_list. Вы можете назначать только его элементы. Следовательно,

arg_list = malloc(...); 

неправ. Вы можете использовать:

arg_list[0] = malloc(...); 

, но это не то, что вам нужно.

Вы должны использовать:

char** arg_list = malloc((sizeof(char*)) * argc); 
+0

Он по-прежнему дает предупреждения о «неявном объявлении функции» и «несовместимом неявном объявлении» и «iso c90 запрещает смешанные декларации и код». Меня это не так беспокоит, поскольку он компилируется, но когда я пытаюсь распечатать его с помощью цикла 'for', используя' printf (arg_list [i]); он приходит с 'X60'? – Bob

+0

Да, это его первая проблема. После этого цикл имеет две ошибки: он должен быть «for (i = argc -1; i> = 0; i - = 1)». Наконец, поскольку вы просто копируете указатели из 'argv' и не копируете сами строки, я не вижу причин для существования этого кода: все, что вы можете сделать с помощью' arg_list', вы можете просто использовать с 'argv'. Я не вижу здесь никаких функций, поэтому я не могу объяснить ошибки: покажите нам весь код. –

+0

@Bob, ваш комментарий здесь подчеркивает важность [минимального, полного и проверяемого примера] (http://stackoverflow.com/help/mcve). Пожалуйста, отправьте сообщение. –