几乎可以肯定是因为你没有为你的字符串分配空间。
myargv[1]="123"; 起作用的原因是因为您将指针设置为指向一个已经存在的字符串(编译器通常将“123”放入预初始化的内存中并且它只是被加载)。通过使用类似的东西:
char *myargv[10];
strcpy (myargv[1], "anything");
您通常会遇到问题,因为没有为 myargv[1] 指针分配后备存储。
您可以做的是简单地将myargv[1] 直接设置到您sprintf 编辑字符串的缓冲区:
char sprintf_buffer[whatever];
sprintf (sprintf_buffer, "%d", myInteger);
myargv[1] = sprintf_buffer;
或者,如果您要重新使用该缓冲区(这样多个整数参数的值会被覆盖),请使用 strdup。
char sprintf_buffer[whatever];
sprintf (sprintf_buffer, "%d", myInteger1);
myargv[1] = strdup (sprintf_buffer);
sprintf (sprintf_buffer, "%d", myInteger2);
myargv[2] = strdup (sprintf_buffer);
如果出于某种原因,您的平台没有strdup,这里有一个适合您:
char *strdup (const char *s) {
char *d = (char *)(malloc (strlen (s) + 1));
if (d != NULL)
strcpy (d,s);
return d;
}
请记住,您应该始终检查来自strdup 的返回值,以确保内存分配有效。我把它留在这里,因为它与手头的问题无关。
您可以避免使用多个缓冲区分配内存(前提是您事先知道需要的缓冲区的绝对数量):
char sprintf_buffer1[whatever];
char sprintf_buffer2[whatever];
sprintf (sprintf_buffer1, "%d", myInteger1);
myargv[1] = sprintf_buffer1;
sprintf (sprintf_buffer2, "%d", myInteger2);
myargv[2] = sprintf_buffer2;