以下代码会导致垃圾或访问冲突错误,为什么会这样......?

发布于 2024-11-03 19:53:36 字数 412 浏览 0 评论 0原文

file1.c

int a[3]={1,39,7}; /* definition */

file2.c

extern int a[]; /* declaration */
b = a[2]; /* correct usage in file2.c */

file3.c

extern int *a; /* another declaration */
c = a[1]; /* a[1] is *(a+1), fails! */

file2中的用法获取a的第3个元素(7),但是 file2 中的用法将 39 解释为地址(假设 32 位整数和地址),导致垃圾或 访问冲突错误为什么会这样......?

file1.c

int a[3]={1,39,7}; /* definition */

file2.c

extern int a[]; /* declaration */
b = a[2]; /* correct usage in file2.c */

file3.c

extern int *a; /* another declaration */
c = a[1]; /* a[1] is *(a+1), fails! */

The usage in file2 obtains the 3rd element (7) of a, but the
usage in file2 interprets 39 as an address (assuming 32
bit integers and addresses), resulting in either garbage or
access violation error why is it so...?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

誰ツ都不明白 2024-11-10 19:53:36

请参阅 C 常见问题解答中的此答案int *aint a[] 不一样!

编辑:
从那里的答案修改:

在一个源文件中定义了一个整数数组,在另一个源文件中声明了一个指向整数的指针。 [...] 指向类型 T 的类型指针与类型 T 的数组不同。

编辑#2:
要了解发生了什么,请查看此答案。修改相关部分以适合您的样品:

a2 [在 file2.c] 是位于名为 a 的对象(开头)之后的两个位置,而 a1 [在file3.c] 是 a 指向的对象后面的一个位置。


所以在 file3.c 中,它认为 a 是一个指针,它被取消引用。由于它实际上是数组本身,因此它被取消引用到其他地方,这会导致访问冲突。

Look at this answer in the C FAQ. int *a and int a[] are not the same!

EDIT:
Modified from the answer there:

In one source file you defined an array of ints and in the other you declared a pointer to ints. [...] The type pointer-to-type-T is not the same as array-of-type-T.

EDIT #2:
To see what happens, look at this answer. The relevant parts, modified to fit your sample:

a2 [in file2.c] is two places past (the start of) the object named a, while a1 [in file3.c] is one place past the object pointed to by a.

So in file3.c it believes a to be a pointer, which is dereferenced. Since it actually is the array itself, this is dereferenced to somewhere else, which results in the access violation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文