下面的程序因大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);
}