Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将具有固定长度字符串的数组传递给C中的函数_C_Arrays_String_Function_Size - Fatal编程技术网

将具有固定长度字符串的数组传递给C中的函数

将具有固定长度字符串的数组传递给C中的函数,c,arrays,string,function,size,C,Arrays,String,Function,Size,我试图让程序启动一个单独的进程,在linux中以长格式列出文件。(换句话说,我试图让我的程序执行“ls-al”)。我遇到的问题是,编译器不断用以下消息警告我:警告:从不兼容的指针类型传递参数2“run” 我该如何解决这个问题 #include <sys/types.h> #include <sys/stat.h> #include <wait.h> #include <fcntl.h> #include <stdio.h> #inclu

我试图让程序启动一个单独的进程,在linux中以长格式列出文件。(换句话说,我试图让我的程序执行“ls-al”)。我遇到的问题是,编译器不断用以下消息警告我:
警告:从不兼容的指针类型传递参数2“run”

我该如何解决这个问题

#include <sys/types.h>
#include <sys/stat.h>
#include <wait.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

    void run(char *app,char* param[250]){
        if (fork()==0){
        execvp(app,param);
        }else{
        wait(NULL);
        }
    }

int main(){
      printf("Running ls -al...\n");
      char param[10][250];
      strcpy(param[0],"ls");
      strcpy(param[1],"-al");
      param[2][0]='\0';
      run("/usr/bin/ls",param);
      printf("\n");
      return 0;
    }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效运行(char*app,char*param[250]){
如果(fork()==0){
execvp(应用程序,参数);
}否则{
等待(空);
}
}
int main(){
printf(“运行ls-al…\n”);
字符参数[10][250];
strcpy(参数[0],“ls”);
strcpy(参数[1],“-al”);
参数[2][0]='\0';
运行(“/usr/bin/ls”,参数);
printf(“\n”);
返回0;
}

除了代码的其他错误外:

此表达式:
char*param[250]
(函数
run()
的第二个参数)

表示该参数是指向250个指向字符数组的指针的数组

这是不对的

表达式应为:
char*param[]

在main()中,最好将param定义为:

char ** param = NULL;
然后在检查错误时分配适当的内存量

if( NULL == (param = malloc( 3* sizeof (char*) ) )
{ // then malloc failed
    perror( "malloc for array of parameters failed" );
    exit( EXIT_FAILURE );
}

// implied else, malloc successful
然后,对于参数值和参数列表终止符:

 param[0] = "ls";  // sets a pointer
 param[1] = "-al"; // sets a pointer
 param[2] = NULL;

此表达式:
param[2][0]='\0'不正确。参数列表中的最后一个条目是
char*
to NULL,不是单个0x00字节,而是所有0x00的“指针大小(32位体系结构上为4字节)”数组,即参数指针列表中的最后一个条目必须是“0x00000000”(对于32位体系结构),即指向地址0的指针请阅读
fork()的手册页
。fork()可以返回3种不同的内容。1) =0,则子进程正在运行。2) >0则父进程正在运行(并且子进程已成功启动)3)调用
execvp()
可能会失败。如果失败,则控制返回到调用
execvp()
后的下一个语句,该语句应该是调用
peror()
,然后调用
exit()
,总体而言,如果fork()失败或execvp()失败,则代码将执行
wait()
,可能永远等待子事件,这永远不会发生。换句话说,始终检查系统函数调用返回的值,以确保它们成功。我已经阅读了fork的手册。在编写代码时,有时我可以让程序运行,但没有传入参数。我知道我的字符串数组(多索引字符数组)存在问题,但我不知道如何使函数以execvp期望的格式接收数据