如何在c中创建一系列符号链接

时间:2015-03-01 20:04:28

标签: c

当我尝试执行此代码时,屏幕上会出现“分段错误”。有人可以告诉我错误是什么吗?提前谢谢

#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char * argv[]){
    int fd , i;
    int count= atoi(argv[2]);
    char name[50];
    char nname[50];
    strcpy(nname, "./lfille");
    strcpy(name, argv[1]);
    struct stat statbuf;
/*  if((fd=open(argv[1], O_RDWR)==-1)){
        fprintf(stderr, "Datei existiert nicht\n");
    }else*/ if((lstat(argv[1], &statbuf)==-1)){
        fprintf(stderr, "Error bei lstat\n");
    }else if(!(S_ISREG(statbuf.st_mode))){
        printf("%s ist nicht REG\n ", argv[1]);
        exit(1);
    }else{
        for(i=0; i<count; i++){
            printf("%s", nname);
            symlink(name, nname);
            sprintf(name,"%s", nname);
            sprintf(nname, "./lfille%d", i);
        }
    }
return 0;
}

1 个答案:

答案 0 :(得分:0)

参数*argv[]是一个字符串指针数组,argc通知该数组的长度。

第一个元素argv[0]指向包含程序名称的字符串。如果在程序运行时提供了任何运行时参数,则为每个参数提供一个字符串指针,并在argc中使用适当的值来告诉您已提供了多少字符串指针数组元素。如果没有提供程序参数,*argv[]数组的长度为1。

如果您尝试访问应该已经给出的参数,那么您将索引超出数组*argv[]的长度,从而导致未定义的行为 。您将取消引用具有基本随机值的指针。这可能是良性的,或者由于尝试访问您不允许的内存而导致分段错误

我建议任何在运行时使用(比如2)用户参数的程序都有类似于此的检查代码:

if (argc < 3) {
    printf ("Syntax should be: %s filename links\n", argv[0]);
    exit (1);
}