【问题标题】:passing array with fixed-length strings to function in C将具有固定长度字符串的数组传递给 C 中的函数
【发布时间】:2015-10-19 23:22:44
【问题描述】:

我正在尝试让程序启动一个单独的进程,该进程只是在 linux 中以长格式列出文件。 (换句话说,我试图让我的程序执行“ls -al”)。我遇到的问题是编译器不断警告我这条消息:warning: passing argument 2 of 'run' from incompatible pointer type

我该如何解决这个问题?

#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;
    }

【问题讨论】:

  • 这个表达式:param[2][0]='\0'; 不正确。参数列表中的最后一个条目是 char * 到 NULL,不是单个 0x00 字节,而是一个 'pointer 大小(在 32 位架构上为 4 个字节)数组,所有 0x00 I.E.参数指针列表中的最后一个条目需要是“0x00000000”(对于 32 位架构)指向地址 0 的指针
  • 请阅读fork() 的手册页。 fork() 可以返回 3 种不同的东西。 1) =0 然后子进程运行。 2) >0 表示父进程正在运行(子进程成功启动) 3) errno 系统变量表示子进程启动失败的原因。发布的代码(不一定有效)假设子进程的启动是成功的。
  • execvp() 的调用可能会失败。如果失败,则控制权返回到调用execvp() 之后的下一条语句,这应该是调用perror(),然后调用exit()
  • 总的来说,如果 fork() 失败或 execvp() 失败,那么代码将执行wait(),可能永远等待子事件,这永远不会发生。换句话说,始终检查调用系统函数的返回值,以确保它们成功
  • 我已经阅读了 fork 的手册。当我正在处理代码时,有时我可以让程序运行但参数没有被传入。我知道问题出在我的字符串数组(多索引字符数组)上,但我不知道如何使函数以 execvp 期望的格式接收数据

标签: c arrays string function size


【解决方案1】:

代码有其他问题:

这个表达式: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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2013-06-27
    • 1970-01-01
    • 2013-05-21
    • 2019-03-18
    • 2013-02-27
    相关资源
    最近更新 更多