为大值获取分段错误

时间:2017-01-08 15:31:42

标签: c pointers segmentation-fault

以下程序因大n(n> 200)的细分而崩溃,请你帮帮我。

.modal.modal-alert .modal-dialog .modal-content .modal-header {
padding: 9px 15px;
border-bottom: 1px solid #eee;
background-color: #0480be;
-webkit-border-top-left-radius: 6px;
-webkit-border-top-right-radius: 6px;
-moz-border-radius-topleft: 6px;
-moz-border-radius-topright: 6px;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
}

.modal.modal-alert .modal-dialog .modal-content {
border-radius: 9px;
padding: 0;
}

2 个答案:

答案 0 :(得分:3)

向指针添加整数时,编译器会执行指针运算。因此编译器将hash + i翻译成(char*)hash + i * sizeof(struct node)之类的内容。为您计算偏移量以字节为单位,然后应用以字节为单位

因此,您的代码等同于

(char*)hash + i * sizeof(struct node) * sizeof(struct node)

这将超出数组边界,调用未定义的行为。

总结评论时,请使用(hash + i)或更简洁(在我看来)hash[i]

答案 1 :(得分:0)

#include <stdio.h>
#include <stdlib.h>

struct node {
    char name[16];
    char num[8];
};

int main(void) {
    size_t n;
    if (scanf("%zu", &n) != 1) {
      return 1;
    }

    struct node *hash = malloc(n * sizeof *hash);
    if (hash == NULL) {
      return 1;
    }

    for (size_t i = 0; i < n; i++) {
        if (scanf("%15s %7s", hash[i].name, hash[i].num) != 2) {
          free(hash);
          return 1;
        }
    }

    for (size_t i = 0; i < n; i++) {
        printf("%s %s\n", hash[i].name, hash[i].num);
    }

    free(hash);
}