C添加数组元素会导致分段错误

时间:2012-06-22 20:34:26

标签: c arrays exec

我已经阅读了几个论坛,但找不到解决方案。

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);

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);

当我以这种方式尝试时,我在尝试执行时遇到分段错误 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);

我错过了什么?

3 个答案:

答案 0 :(得分:2)

将我的评论转化为答案:行strcpy(serverArgs [2],“/ dev / server1 / strunk / build.xml”);可能不好 - 该字符串大于20个字符。您应该完全确定malloc有足够的空间容纳可能进入阵列的所有内容。

答案 1 :(得分:1)

查看execv的手册页:

  

指针数组必须以NULL指针终止。

答案 2 :(得分:0)

您的第二个解决方案通常很好,但如果您在平台上使用它,请使用strdup代替mallocstrcpy一次性分配和复制字符串。如果你没有strdup,那么自己写一个就不是很难了。

另外,为此您不会对字符串数组感到惊讶,请执行以下操作:

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

正确初始化所有指针。