我正在尝试将字符串拆分为“tmp”并将其放入指针数组“arr”中。我这样做是因为我打算在“arr”上使用“execv”,但我不能,因为“arr”最后没有NULL。相反它有“(null)”,当我打印它的内容时,我得到一个分段错误。 如何正确设置“arr”以便它可以与execv一起使用?感谢
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string.h>
int main(){
char tmp[40] = "echo Hello World \n ";
char *arr[40];
char *token = strtok(tmp, " \n");
int index = 0;
while(token != NULL){
arr[index] = malloc(strlen(token) + 1);
arr[index] = token;
index = index + 1;
token = strtok(NULL, " \n");
}
for(int i = 0; i < 40; i++){
printf("%s \n", arr[i], arr[i]);
}
return 0;
}
答案 0 :(得分:2)
这是一个很大的问题:
arr[index] = malloc(strlen(token) + 1);
arr[index] = token;
您不复制字符串,而是覆盖指针。您应该使用strcpy
复制字符串:
strcpy(arr[index], token);
在这种情况下,可能不需要复制字符串,只需要赋值即可。这也意味着不需要分配。
您的代码还有另一个问题:在arr
中打印字符串的循环。
使用您拥有的字符串,您应该只有三个元素在arr
中有效,其余元素将是未初始化且不确定。取消引用它们(就像您尝试打印它们指向的“字符串”时所做的那样)将导致undefined behavior。
在上一个循环之后,您初始化arr
,然后index
将是arr
中有效元素的数量。使用它作为打印循环的结束:
for(int i = 0; i < index; i++){ ... }