2012-06-22 3 views
0

Я прочитал несколько форумов, но не могу найти решение этого.C Добавление элементов массива вызывает ошибку сегментации

int sIndex = 3; 
char serverArgs[serverCommandCount + 3][20]; 


strcpy(serverArgs[0], "ant"); 
strcpy(serverArgs[1], "-f"); 
strcpy(serverArgs[2], "/dev/server1/trunk/build.xml"); 
if(serverStop){strcpy(serverArgs[sIndex], "jboss-stop"); sIndex++;} 
if(serverClean){strcpy(serverArgs[sIndex], "clean"); sIndex++;} 
if(serverDeploy){strcpy(serverArgs[sIndex], "deploy"); sIndex++;} 
if(releaseDB){strcpy(serverArgs[sIndex], "releasedb"); sIndex++;} 
if(createDB){strcpy(serverArgs[sIndex], "createdb"); sIndex++;} 
if(serverStart){strcpy(serverArgs[sIndex], "jboss-start"); sIndex++;} 
if(serverDebug){strcpy(serverArgs[sIndex], "jboss-start-debug"); sIndex++;} 

execv(antEx, serverArgs); 

В этом решении проблема заключается в том, что execv хочет char * [], а не char [].

int sIndex = 3; 
char *serverArgs[serverCommandCount + 3]; 

for(index = 0; index < serverCommandCount + 3; index++) 
    serverArgs[index] = malloc(20); 
strcpy(serverArgs[0], "ant"); 
strcpy(serverArgs[1], "-f"); 
strcpy(serverArgs[2], "/dev/server1/trunk/build.xml"); 
if(serverStop){strcpy(serverArgs[sIndex], "jboss-stop"); sIndex++;} 
if(serverClean){strcpy(serverArgs[sIndex], "clean"); sIndex++;} 
if(serverDeploy){strcpy(serverArgs[sIndex], "deploy"); sIndex++;} 
if(releaseDB){strcpy(serverArgs[sIndex], "releasedb"); sIndex++;} 
if(createDB){strcpy(serverArgs[sIndex], "createdb"); sIndex++;} 
if(serverStart){strcpy(serverArgs[sIndex], "jboss-start"); sIndex++;} 
if(serverDebug){strcpy(serverArgs[sIndex], "jboss-start-debug"); sIndex++;} 

execv(antEx, serverArgs); 

Когда я пытаюсь это так, я получаю ошибку сегментации, когда он пытается выполнить

strcpy(serverArgs[1], "-f");

Что мне не хватает?

+0

Я также пробовал это без malloc. –

+4

Строка 'strcpy (serverArgs [2]," /dev/server1/trunk/build.xml ");', вероятно, не очень хорошая - эта строка больше, чем двадцать символов. – Peter

+0

@Peter Вы должны добавить это как ответ (вместо комментария к вопросу). –

ответ

1

Проверьте страницу человека для execv:

Массив указателей должен заканчиваться NULL указателя.

+0

Хорошо, но я не думаю, что могу даже зайти так далеко, потому что он падает при добавлении второго элемента. Это моя цель: char * serverArgs [] = {"ant", "-f", "/dev/server1/trunk/build.xml", "solr-stop", "solr-start", (char *) 0}; но мне нужно определить, какие/сколько вариантов включить. –

+0

Учитывая код, который мы видим, не имеет смысла, что он сбой в этой строке, за исключением случаев, когда 'malloc' возвращает' NULL'. В любом случае всегда нужно это проверять, но в этом случае, тем более. Добавьте проверку «NULL», настройте размер 'malloc' для длинной строки, сделайте свой массив длиннее для завершения« NULL »и повторите попытку. Если он по-прежнему падает, нам нужно больше кода, потому что тогда это невозможно. –

+0

Итак, вот где я сейчас: int sIndex = 3; \t \t char *serverArgs[serverCommandCount + 4]; for(index = 0; index < serverCommandCount + 4; index++) serverArgs[index] = malloc(100); ... execv(antEx, serverArgs); Теперь он переходит к команде execv(), но сбой там. Вот сообщение, которое я получаю, когда компилирую: предупреждение: передача аргумента 2 из 'execv' из несовместимого указателя типа –

0

Ваше второе решение, как правило, хороший, но если у вас есть на вашей платформе, используйте strdup вместо malloc и strcpy выделить и скопировать строки на одном дыхании. Если у вас нет strdup, писать его не будет очень сложно.

Кроме того, для этого вам не сюрприз для вашего массива строк, сделайте следующее:

char *serverArgs[serverCommandCount + 3] = { 0 }; 

инициализировать все указатели правильно.

+0

Я действительно не понимаю, как strdup будет работать в этом обстоятельстве, вы дадите мне пример? –

+0

Вы бы использовали нечто вроде 'serverArgs [i] = strndup (" foo bar baz mumble pies ", 19);'. Это копирует строку «foo ...» длиной до 19 символов (размер буфера минус один нулевой символ в конце) и помещает ее в массив. Попробуйте 'man strdup'. – Peter

+0

«размер буфера минус один нулевой символ» - здесь нет буфера (цикл malloc может/должен быть опущен). strdup, а не strndup, является правильной функцией для использования здесь. Есть редкие случаи использования strndup, но это не один из них. –

2

Превращение моего комментария в ответ: строка strcpy (serverArgs [2], "/dev/server1/trunk/build.xml"); вероятно, не является хорошим - эта строка больше, чем двадцать символов. Вы должны быть абсолютно уверены, что вам достаточно места для всего, что могло бы попасть в массив.

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