gpt4 book ai didi

c - 为什么我收到警告 : (near initialization for ‘ptr’ ) and segmentation fault at runtime when accsessing value at pointer?

转载 作者:太空狗 更新时间:2023-10-29 16:01:07 24 4
gpt4 key购买 nike

这是下面的代码:为什么当我尝试访问数组的第一个值时出现段错误?这些警告是什么?

#include<stdio.h>
int main(void)
{
int *ptr = {1,2,3,4,5};//Is it not similar to char *ptr="Stackoverflow"?
printf("%d\n",*ptr);// why Segmentation fault(core dumped) instead of 1
return 0;
}

...
output:

warning: initialization makes pointer from integer without a cast [enabled by default]
int *ptr = {1,2,3,4,5};
^

warning: (near initialization for ‘ptr’) [enabled by default]
warning: excess elements in scalar initializer [enabled by default]
warning: (near initialization for ‘ptr’) [enabled by default]
warning: excess elements in scalar initializer [enabled by default]
warning: (near initialization for ‘ptr’) [enabled by default]
warning: excess elements in scalar initializer [enabled by default]
warning: (near initialization for ‘ptr’) [enabled by default]
warning: excess elements in scalar initializer [enabled by default]
warning: (near initialization for ‘ptr’) [enabled by default]

最佳答案

//Is it not similar to char *ptr="Stackoverflow"?

TL;DR 不,不是。


使用的初始化器 {1,2,3,4,5} 被称为大括号括起来的初始化器,它应该初始化类型的值要素。这用于聚合或 union 类型类型,如C11,章节§6.7.9,初始化

中所述

the initializer for an object that has aggregate or union type shall be a brace enclosed list of initializers for the elements or named members.

在这里,初始化器列表包含所有 int 值,并且您正在尝试初始化一个 pointer 认为它。这是错误的。

此外,关于标量类型,引用 C11,第 6.2.5 章

Arithmetic types and pointer types are collectively called scalar types.[...]

聚合类型

[...]Array and structure types are collectively called aggregate types.

这里有很多问题,比如

  1. 您正在使用 int 值来初始化 int *
  2. 您最终会提供一个大括号括起来的列表,其中包含多个标量 对象的初始化元素。

所以,稍后在您的代码中,

 printf("%d\n",*ptr);

本质上是一个无效内存访问,调用undefined behavior .段错误是众多副作用之一。

来到评论的重点,

char *ptr="Stackoverflow"?

char *ptr="Stackoverflow"; 的情况下,这里 "Stackoverflow" 被称为 string literal ptr字符串文字 的基地址初始化。


解决方法:

您需要有一个 int数组,您可以使用大括号括起来的初始化程序对其进行初始化。沿线的东西

 int ptr[] = {1,2,3,4,5};

将有效。然后你可以像这样使用它

 for(int i = 0; i < 5; i++)
printf("%d\t", *(ptr+i));

关于c - 为什么我收到警告 : (near initialization for ‘ptr’ ) and segmentation fault at runtime when accsessing value at pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35345409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com