c - 为什么这个c程序会崩溃?

标签 c arrays string function pointers

我想制作一个列表,例如 10 通过键盘输入的句子。为了获取一行,我使用函数 getline()。谁能解释为什么这个程序在进入第二行时崩溃?哪里错了?

#define LISTMAX 100
#define LINEMAX 100
#include <stdio.h>
#include <string.h>
void getline(char *);
int main ()
{
    char w[LINEMAX], *list[LISTMAX];
    int i;
    for(i = 0; i < 10; i++)
    {
        getline(w);
        strcpy(list[i], w);
    }
    for(i = 0; i < 10; i++)
        printf("%s\n", list[i]);
    return 0;
}

void getline(char *word)
{
    while((*word++ = getchar()) != '\n');
    *word = '\0';
}

最佳答案

一个字符串是一个内存块(一个数组),它包含char,以'\0'结束。 char * 不是字符串;它只是指向字符串中第一个 char 的指针。

strcpy 不会 创建新字符串。它只是将数据从一个内存块复制到另一个内存块。所以你的问题是:你没有分配内存块来保存字符串。

我将向您展示两种解决方案。第一个解决方案是:更改 list 的声明,使内存已经分配。如果你这样做,你可以避免使用 strcpy,所以你的代码更简单:

// no need for w
char list[10][LISTMAX];

// ...

// get the line straight into list
// no need to copy strings
getline(list[i]);

但是如果您想扩展自己,第二种解决方案是在您知道需要时分配内存块。您需要在 C 中经常这样做,所以也许现在是学习这项技术的好时机:

#include <stdlib.h> // include the malloc function

// ...

char w[LINEMAX], * list[LISTMAX]

// put this line between the getline and strcpy lines
list[i] = (char *) malloc((strlen(w) + 1) * sizeof(char));

这个解决方案比较复杂,但您只需为字符串分配所需的内存。如果字符串的长度为 10 个字符,您只需向系统请求足够的内存来容纳 11 个字符(10 个字符 + '\0')。如果您想读入一个文件,而您不知道该文件有多大,这一点很重要。

顺便问一下,为什么要将 LINEMAXLISTMAX 作为单独的常量?你能想出它们可能不同的原因吗?为什么不将 10 设为常量?这不是更好吗?

#define LINEMAX 100
#define NUMBER_OF_LINES 10

// ...

char list[NUMBER_OF_LINES][LINEMAX];

// ...

for (i = 0; i < NUMBER_OF_LINES; i++)

关于c - 为什么这个c程序会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19073773/

相关文章:

r - 在 R 中用 n 个单词拆分字符串

java - 将字符串分成三分之一

c - 尝试在 c 中实现并发 TCP 服务器和客户端

c - C 中获取二维数组的长度

python - 将 4 个多维数组合并为一个数组,同时保持原始维度 - Python

java - 测验程序中数组索引越界异常

java - 从字符串中删除重音

c - 如何以 C 标准方式进行位表示?

c - 如何将结构显式对齐为 4 个字节

javascript - 数组函数返回 null