C - 存储到空指针错误,分段错误
C - store to null pointer error, segmentation fault
请耐心等待我的代码。我是 C 的初学者。下面的代码构建了一个 Vigenere 密码。用户输入一个 key
参数,用于加密 plaintext
消息。该代码将输出 ciphertext
.
我收到的错误如下。注意我还没研究过指针
如果能帮助诊断错误,我们将不胜感激!
vigenere.c:47:13: runtime error: store to null pointer of type 'char'
Segmentation fault
代码
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[]){
// check for 2 arguments
if (argc != 2){
printf("missing command-line argument\n");
return 1;
}
// check for character argument
int i,n;
for (i = 0, n = strlen(argv[1]); i < n; i++){
if (!isalpha(argv[1][i])){
printf("non-character argument\n");
return 1;
}
}
// if previous 2 checks are cleared, request 'plaintext' from user
printf("plaintext:");
// declare plaintext, key, and ciphertext
string t = get_string(); // plaintext
string u = argv[1]; // key (argument)
string y = NULL; // ciphertext
// encode plaintext with key -> ciphertext
for (i = 0, n = strlen(t); i < n; i++){
if (tolower(t[i])){
y[i] = (char)((((int)t[i] + (int)tolower(u[i%n])) - 97) % 26) + 97;
} else {
y[i] = (char)((((int)t[i] + (int)tolower(u[i%n])) - 65) % 26) + 65;
}
}
printf("ciphertext: %s\n", y);
}
您收到此错误消息是因为变量 y
是 NULL
。
类型 string
实际上是 typedef
(换句话说,别名)到 char *
,这意味着 "pointer to char
" 因此 y
是指向 char 的指针.
当您执行 y[i]
时,您取消了对 NULL
指针的引用,这是不允许的并会导致错误。 NULL
代表一个不存在的内存space所以你不能在这里存储你的密文!
要解决此问题,您可以按如下方式声明和初始化 y
:
char *y = calloc(strlen(t) + 1, sizeof(char)); // Ciphertext, ready to hold some data !
您必须#include <stdlib.h>
才能使用calloc()
功能。
现在,y
是一个指向内存 space 和 t
一样大的指针(明文和密文具有相同的大小),您可以取消引用并将数据写入!
在进一步学习之前,您绝对应该了解指针以及内存的工作原理。一些程序员老兄 post 在您原作 post 的评论中编了一个很棒的书单,看看吧!
请耐心等待我的代码。我是 C 的初学者。下面的代码构建了一个 Vigenere 密码。用户输入一个 key
参数,用于加密 plaintext
消息。该代码将输出 ciphertext
.
我收到的错误如下。注意我还没研究过指针
如果能帮助诊断错误,我们将不胜感激!
vigenere.c:47:13: runtime error: store to null pointer of type 'char'
Segmentation fault
代码
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[]){
// check for 2 arguments
if (argc != 2){
printf("missing command-line argument\n");
return 1;
}
// check for character argument
int i,n;
for (i = 0, n = strlen(argv[1]); i < n; i++){
if (!isalpha(argv[1][i])){
printf("non-character argument\n");
return 1;
}
}
// if previous 2 checks are cleared, request 'plaintext' from user
printf("plaintext:");
// declare plaintext, key, and ciphertext
string t = get_string(); // plaintext
string u = argv[1]; // key (argument)
string y = NULL; // ciphertext
// encode plaintext with key -> ciphertext
for (i = 0, n = strlen(t); i < n; i++){
if (tolower(t[i])){
y[i] = (char)((((int)t[i] + (int)tolower(u[i%n])) - 97) % 26) + 97;
} else {
y[i] = (char)((((int)t[i] + (int)tolower(u[i%n])) - 65) % 26) + 65;
}
}
printf("ciphertext: %s\n", y);
}
您收到此错误消息是因为变量 y
是 NULL
。
类型 string
实际上是 typedef
(换句话说,别名)到 char *
,这意味着 "pointer to char
" 因此 y
是指向 char 的指针.
当您执行 y[i]
时,您取消了对 NULL
指针的引用,这是不允许的并会导致错误。 NULL
代表一个不存在的内存space所以你不能在这里存储你的密文!
要解决此问题,您可以按如下方式声明和初始化 y
:
char *y = calloc(strlen(t) + 1, sizeof(char)); // Ciphertext, ready to hold some data !
您必须#include <stdlib.h>
才能使用calloc()
功能。
现在,y
是一个指向内存 space 和 t
一样大的指针(明文和密文具有相同的大小),您可以取消引用并将数据写入!
在进一步学习之前,您绝对应该了解指针以及内存的工作原理。一些程序员老兄 post 在您原作 post 的评论中编了一个很棒的书单,看看吧!