使用char指针进行分段错误(C)

时间:2015-11-10 20:42:20

标签: c pointers

我一直试图弄清楚我在这段代码中做错了一段时间但仍然没有运气。根据GDB,我收到了SIGSEV,Segmentation Fault,这意味着我试图访问无效的内存地址。

这里我试图找到传递的char指针的长度

int getLength(char *start) {
 int count = 0;
 while(*start) {
   count++;
   start++;
 }
 return count;
}

这是我的完整C档案。我认为它可能有用

  #include <stdlib.h>
  #include <stdio.h>

  int main(int argc, char *argv[]) {
    int len1 = getLength(argv[1]);
    int len2 = getLength(argv[2]);  

    if (argc != 3) {
     fprintf(stderr, "Invalid number of items input.\n");
     return 1;
    }

    if (len1!=len2) {
     fprintf(stderr,"From and to are not the same size.\n");
     return 1;
    }
    return 0;   
 }

 int getLength(char *start) {
    int count = 0;
    while(*start) {
     count++;
     start++;
    }
   return count;
 }

 int duplicatesFrom(char *from) {
   int i;
   int j;

   int len = getLength(from); 

   for(i=0;i<len;i++) {
    for(j=0;j<len;j++) {
      if (from[i]==from[j] && i!=j) {
        return 1;
      }
    }
   }
   return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,如果你没有给你的程序至少提供3个参数,那么它会崩溃,因为你在getLength的开头用第二个和第三个参数作为参数调用main()

我建议你将两个第一行移到参数计数检查之下。

然后,正如BathSheba所建议的那样,你应该考虑将char *传递给getLength() const,因为getLength()不会修改它。这是一个很好的做法,使代码更加不言自明。

此外,如果您的定义低于main(),请不要忘记在main()中使用的函数的前向声明,除非您将前向声明放在头文件中(代码中都没有)段)。

最后一件事:在getLength()中,您应该通过执行char *之类的操作来检查传递的if (start){...}是否有效。因为如果start == NULL,您的程序将崩溃,因为您将尝试访问空指针。

在您进行修改后:您无法将if()语句与else if()逻辑后跟其分开。此处else if()可以更改为if(),因为在您输入第一个if()的情况下,您退出程序(return 1;)。如果不这样做(如果有3个参数传递给该程序),您可以安全地检查argv[1]argv[2]是否具有相同的长度。

你的主要,略有修改:

int main(int argc, char *argv[]) {

    if (argc != 3) {
        fprintf(stderr, "Invalid number of items input.\n");
        return 1;
    }

    int len1 = getLength(argv[1]);
    int len2 = getLength(argv[2]);

    if (len1 != len2) {
        fprintf(stderr, "%s and %s are not the same size.\n", argv[1], argv[2]);
        return 1;
    }
    else {
        printf("%s", "Hello\n");
    }

    return 0;
}