C语言 获取大值的分段错误



下面的程序因大n(n> 200)的分割而崩溃,您能在这里帮助我吗?

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
struct node {
    char name[16];
    char num[8];
};
int main() {
    int n, i,j;
    struct node *hash;
    scanf("%d",&n);
    hash = (struct node *) malloc(n * sizeof(struct node));
    for (i=0; i<n ; i++) {
        scanf("%s %s", (hash + (i *sizeof(struct node)))->name,
                        (hash + (i *sizeof(struct node)))->num);
    }   
 for (i=0; i<n ; i++) {
        printf("%s=%sn",(hash + (i *sizeof(struct node)))->name,
                        (hash + (i *sizeof(struct node)))->num);
  }
 return (0);
}

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

因此,您的代码等效于

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

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

正如评论所总结的那样,要么使用(hash + i),要么使用更简洁(在我看来)hash[i].

#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 %sn", hash[i].name, hash[i].num);
    }
    free(hash);
}

相关内容

  • 没有找到相关文章