C程序中使用char *数组和malloc的分段错误



愚蠢的小C程序,但对于我的生活,我不明白为什么我一直得到分割错误。我相信我用malloc分配了足够的内存。任何帮助都将非常感激。代码应该从用户那里读取一个月中的一天和'提醒'字符串,然后将它们读入数组提醒所指向的数据中,并使用malloc分配内存空间。

/* Prints a one-month reminder list (dynamic string version) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_REMIND 50           /* maximum number of reminders */
#define MSG_LEN 60              /* maximum length of reminder message */
int read_line(char str[], int n);
int main(void)
{
    char *reminders[MAX_REMIND];
    char day_str[3], msg_str[MSG_LEN+1];
    int day, i, j, num_remind = 0;
    for (;;) {
        if (num_remind == MAX_REMIND) {
            printf("-- no space left --n");
            break;
        }
        printf("Enter day and reminder: ");
        scanf("%2d", &day);
        if (day == 0) {
            break;
        } 
        sprintf(day_str, "%2d", day);
        read_line(msg_str, MSG_LEN);
        for (i = 0; i < num_remind; i++) {
            if (strcmp(day_str, reminders[i]) < 0) {
                break;
            }
        }
        for (j = num_remind; j > i; j--) {
            reminders[j] = reminders[j-1];
        }
        reminders[i] = malloc(2 + strlen(msg_str) + 10);
        if (reminders[i] = NULL) {
            printf("-- No Space Left --n");
            break;
        }
        strcpy(reminders[i], day_str);
        strcat(reminders[i], msg_str);
        num_remind++;
    }
    printf("nDay Remindern");
    for (i = 0; i < num_remind; i++) {
        printf(" %sn", reminders[i]);
    }
    return 0;
}
int read_line(char str[], int n) {
    int ch, i = 0;
    while ((ch = getchar()) != 'n') {
        if (i < n) {
            str[i++] = ch;
        }
    }
    str[i] = '';
    return i;
}
    if (reminders[i] = NULL) {

先设置reminders[i]NULL再解引用

可怕的赋值/比较打字错误!这是一个提示,说明你的编译器警告级别设置得不够高,或者你忽略了警告。

// Should be '==' not '='
if (reminders[i] = NULL) {
    printf("-- No Space Left --n");
    break;
}

另外,您的read_line函数与fgets类似,这可以简化事情。

最后,始终验证您的用户输入。确保scanf返回您所请求的项数(对于简单的单项输入通常为1)。否则,您可能会遇到未定义的行为。

错误:

if (reminders[i] = NULL) {

:

if (reminders[i] == NULL) {

也,你正在连接day_str &msg_str,所以最好分配:

reminders[i] = malloc(2 + strlen(msg_str) + strlen(day_str));

在if子句中执行赋值操作。应该是这样的:

if (reminders[i] == NULL) {
    printf("-- No Space Left --n");
    break;
}

相关内容

  • 没有找到相关文章