【问题标题】:KERN_INVALID_ADDRESS has me stumpedKERN_INVALID_ADDRESS 让我难过
【发布时间】:2012-10-19 14:31:49
【问题描述】:

我在尝试运行调试器时不断收到此错误:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x00007fff8c2414f0 in strlen ()

这是我的代码:

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char s2[25];
    strcpy(s2, argv[1]);
    int keyLen = strlen(s2);
    printf("Please enter a string of text to be encrypted!\n");
    string p = GetString();
    for (int i = 0, n = strlen(p); i < n; i++)
    {
        if (isupper(p[i])){
        int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A');
        char c = 'A' + sum%26;
        printf("%c", c);
        }
    }
    printf("\n");
    printf("%d\n", keyLen);

}

我可以毫无错误地编译代码,并且可以正常工作。我正在运行调试器以进入for 循环并查看数学在做什么以更好地理解它。

【问题讨论】:

  • 看起来像一个空指针?
  • GetString 是什么? string?
  • 是否至少有一个参数提供给程序,不超过 24 个字符?
  • 这比我的回答更有可能! (特别是因为我们不确定它在哪里崩溃......)

标签: c vigenere cs50


【解决方案1】:

如果GetString() 返回null,则调用strlen(null) 将给出此错误。 GetString() 的其他错误也可能导致此问题。

【讨论】:

    【解决方案2】:

    什么是 C 中的“字符串”类型? Strlen() 需要 C 类型的数组,而不是一些自定义的“字符串”类型。 (+上面提到的可能是空输入)

    【讨论】:

    • &lt;cs50.h&gt; 包含 typedef char *string; — 无论好坏。
    【解决方案3】:

    感谢hmjd,我终于得到了它我运行不正确我会启动程序

    gdb vignere HHHHH
    

    我跑的不正确

    gdb vignere
    run HHHHHH
    

    效果很好!

    【讨论】:

    • 您应该在程序中添加if (argc &gt; 1) 检查以避免这种情况。
    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多