【发布时间】:2016-09-02 15:42:12
【问题描述】:
我有两个文件,User.h 和 test.c:
用户.h
include <stdio.h>
#include <string.h>
struct User {
char name[21];
};
struct User newUser(char* name) {
struct User newUser;
memset(newUser.name, '\0', 21); // ensure string ends with '\0'
memcpy(newUser.name, name, 20); // copy first 20 chars of string
return newUser;
}
test.c
#include "User.h"
int main() {
struct User testUser = newUser(34);
printf("name is: %s\n", testUser.name);
return 0;
}
我故意将错误类型的参数传递给函数,但试图避免段错误:
如果我要向 newUser() 传递任意长度的字符串,该函数将占用最多 20 个字符并将其存储在 .name 中而不会出现段错误,因为它保证以空字节结尾。
这里我传递的是一个 int。因为它需要一个字符串,所以我收到一个编译器警告,但它无论如何都会编译。运行时,出现分段错误。
我想当函数读取到 name[21] 数组时会发生分段错误,但是如果保证它有一个空字节,为什么它会继续读取它呢?它期待一个字符串,它不应该将任何参数视为字符串并在'\ 0'处终止吗?
看来我的逻辑有缺陷,有人可以告诉我这里到底发生了什么吗?
【问题讨论】:
-
我一直想学一个口齿不清的人,鸡计划看起来棒极了!谢谢你的参考。
标签: c string segmentation-fault int parameter-passing