AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76938398
Accepted
sdbbs
sdbbs
Asked: 2023-08-20 15:31:51 +0800 CST2023-08-20 15:31:51 +0800 CST 2023-08-20 15:31:51 +0800 CST

Possível inicializar o ponteiro para a matriz de variáveis ​​digitadas?

  • 772

Estive olhando c ponteiro para array de structs e tentando aplicá-lo ao meu exemplo.

Cheguei a este trecho de código, que compila bem:

#include <stdio.h>

enum test_e {
    eONE,
    eTWO,
    eTHREE,
};
typedef enum test_e test_t;

#define NUMITEMS 12
extern test_t my_arr[NUMITEMS];

test_t (*my_arr_ptr)[NUMITEMS];

test_t my_arr[NUMITEMS] = { 0 };


int main()
{
    my_arr_ptr = &my_arr;
    printf("Hello World %p\n", my_arr_ptr);

    return 0;
}

No trecho acima, temos uma atribuição de my_arr_ptrvariável ao endereço da my_arrvariável (usando o operador "endereço de ", e comercial &).

No entanto, o que eu gostaria de fazer é inicializar a my_arr_ptr variável com o endereço da my_arrvariável - o que eu acho possível, visto que após a linha test_t my_arr[NUMITEMS] = { 0 };o compilador deve "saber" um endereço e tamanho de my_arr.

No entanto, se eu tentar isso:

#include <stdio.h>

enum test_e {
    eONE,
    eTWO,
    eTHREE,
};
typedef enum test_e test_t;

#define NUMITEMS 12
extern test_t my_arr[NUMITEMS];

test_t (*my_arr_ptr)[NUMITEMS];

test_t my_arr[NUMITEMS] = { 0 };

my_arr_ptr = &my_arr;

int main()
{
    //my_arr_ptr = &my_arr;
    printf("Hello World %p\n", my_arr_ptr);

    return 0;
}

... isso falha com:

Compilation failed due to following error(s).

main.c:25:1: warning: data definition has no type or storage class
   25 | my_arr_ptr = &my_arr;
      | ^~~~~~~~~~
main.c:25:1: warning: type defaults to ‘int’ in declaration of ‘my_arr_ptr’ [-Wimplicit-int]
main.c:25:1: error: conflicting types for ‘my_arr_ptr’; have ‘int’
main.c:21:10: note: previous declaration of ‘my_arr_ptr’ with type ‘test_t (*)[12]’ {aka ‘enum test_e (*)[12]’}
   21 | test_t (*my_arr_ptr)[NUMITEMS];
      |          ^~~~~~~~~~
main.c:25:14: warning: initialization of ‘int’ from ‘test_t (*)[12]’ {aka ‘enum test_e (*)[12]’} makes integer from pointer without a cast [-Wint-conversion]
   25 | my_arr_ptr = &my_arr;
      |              ^
main.c:25:14: error: initializer element is not computable at load time
main.c: In function ‘main’:
main.c:30:26: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’ [-Wformat=]
   30 |     printf("Hello World %p\n", my_arr_ptr);
      |                         ~^     ~~~~~~~~~~
      |                          |     |
      |                          |     int
      |                          void *
      |                         %d

Tanto quanto eu posso ver, "aviso: a definição de dados não tem tipo ou classe de armazenamento" ocorre:

porque você não pode executar o código fora das funções
( Por que estou recebendo este erro: "definição de dados não tem tipo ou classe de armazenamento"? )

Então, a obtenção de "endereço de" é considerada "código" em C, então não posso usá-lo fora das funções?

Em caso afirmativo, como posso usar "endereço do" operador "funções externas" no trecho abaixo, que também compila bem?:

#include <stdio.h>

void func_one(void) {
    printf("func_one\n");
}

void func_two(void) {
    printf("func_two\n");
}

void* funcs_arr[2] = { &func_one, &func_two  }; 

int main()
{
    printf("Hello World %p\n", funcs_arr[0]);

    return 0;
}
arrays
  • 1 1 respostas
  • 30 Views

1 respostas

  • Voted
  1. Best Answer
    tstanisl
    2023-08-20T15:35:43+08:002023-08-20T15:35:43+08:00

    As variáveis ​​globais são inicializadas em sua definição. Apenas faça:

    extern test_t my_arr[NUMITEMS];
    
    test_t (*my_arr_ptr)[NUMITEMS] = &my_arr;
    

    Endereços de objetos globais são expressões constantes e podem ser usados ​​para inicializar outros objetos globais. Veja 6.6p7 :

    Mais latitude é permitida para expressões constantes em inicializadores. Essa expressão constante deve ser, ou avaliada para, um dos seguintes:

    • uma expressão constante aritmética,
    • uma constante de ponteiro nulo,
    • uma constante de endereço , ou
    • uma constante de endereço para um tipo de objeto completo mais ou menos uma expressão de constante inteira.

    A definição de "constante de endereço" pode ser encontrada em 6.6p9 :

    Uma constante de endereço é um ponteiro nulo, um ponteiro para um lvalue que designa um objeto de duração de armazenamento estático ou um ponteiro para um designador de função; ele deve ser criado explicitamente usando o operador & unário ou uma conversão de constante inteira para o tipo de ponteiro, ou implicitamente pelo uso de uma expressão de array ou tipo de função. O array-subscript [] e o acesso ao membro. e -> operadores, os operadores unários de endereço & e indireção * e conversões de ponteiro podem ser usados ​​na criação de uma constante de endereço, mas o valor de um objeto não deve ser acessado pelo uso desses operadores.

    • 2

relate perguntas

  • Swift Array, como recuperar todos os elementos em uma enumeração aninhada de uma matriz

  • Por que uma string C nem sempre é equivalente a uma matriz de caracteres?

  • PowerShell: Como transformar valores de matriz hastable como este?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve