是啥导致发生分段错误?

Posted

技术标签:

【中文标题】是啥导致发生分段错误?【英文标题】:What is causing Segmentation error to occur?是什么导致发生分段错误? 【发布时间】:2016-12-11 12:48:16 【问题描述】:

如上运行程序显示分段错误。为什么会这样? 该程序适用于 vigenere cipher 。我正在做的是将密钥存储在一个字符串中,然后像我们以前在凯撒密码中所做的那样存储密钥的整数值,然后实现 vigenere 密码,但是如果我编译它然后使用 ./a.out,它会以某种方式显示分段错误熏肉。我无法弄清楚为什么会发生(导致分段错误的原因)。

#include<stdio.h>
#include<cs50.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int main(int argc, string argv[])

    if((argc==2)&&(isalpha(argv[1])))
    
        string k;
        k=argv[1];
        string p = GetString();
        int lenkey=strlen(k);
        int lenp=strlen(p);
        string c="hello";
        char temp;

        //change key to lowercase and store the shift value as in caesar
        for(int i=0;i<lenkey;i++)
        
            temp=tolower(k[i]);
            k[i]=temp -'a';

        
        int j=0;
        for(int i=0;i<lenp;i++)
        
            //i is for plaintext j is for key
            if(isalpha(p[i]))
            
                j++;
                if(j==(lenkey-1)) j=0;//reset the key if end is reached
                if(isupper(p[i]))
                
                    p[i] = p[i]-'A';
                    c[i] = (p[i]+k[j])%26;
                    c[i] = c[i]+'A';
                
                if(islower(p[i]))
                
                    p[i] = p[i]-'a';
                    c[i] = (p[i]+k[j])%26;
                    c[i] = c[i]+'a';
                
            
            else
                c[i]=p[i];
        

        printf("%s\n",c);
        return 0;
    
    else
       printf("what?\n");
        return 1;
    

【问题讨论】:

string?我假设它在cs50.h 中,因为它不存在于任何其他(标准)标题中。所以你的代码可以,从字面上看,可以做任何事情! stringtypedef char* string,它位于 cs50 头文件中 好的,那么GetString() 会给你什么? GetString() 从用户那里获取输入并存储在字符串中 【参考方案1】:

关于atoi:“返回将输入字符解释为数字所产生的 int 值。如果输入不能转换为该类型的值,则返回值为 0。

所以您的atoi(c) -'a' 将失败并产生一个负数(c 是字符串“hello”,不能解释为数字)。

你的意思可能是:

        temp=tolower(k[i]);
        k[i]=temp -'a';


以下也可能是错误:
    for(int i=0;i<lenp;i++) 
        ...
        c[i] = c[i]+'A';

因为i&lt;lenp但它必须小于c的长度,即5。

除此之外,char *c="hello" 使 c 成为常量字符串(文字),您不能修改文字。因此:段错误。使用:

char c[]="hello";

(所有人,包括老师:放弃string!它让所有人感到困惑!)

【讨论】:

使用调试器检查哪里崩溃了。错误可能不止这一个。

以上是关于是啥导致发生分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的字符串分配会导致分段错误?

确定导致分段错误的代码行?

OpenCV 分配导致 std::thread::join 中的段错误

在新线程内调用OpenCV函数Canny()会导致分段错误

delete[] 运算符在非常简单的情况下导致分段错误

为啥释放内存会导致分段错误?