pode realloc Array, então Por que usar ponteiros?

Esta foi uma entrevista de emprego que enfrentei. Eles perguntaram se podemos realocar Array, eu disse sim. Então eles perguntaram - então porque precisamos de ponteiros, já que a maioria das pessoas acredita que desperdiça espaço de memória. Eu não pude dar resposta satisfatória. Se algum corpo puder dar uma resposta satisfatória, serei obrigado. Por favor, mencione qualquer situação em que a declaração acima possa contradizer.

Obrigado.

2

4 Respostas

Você só pode realocar uma matriz que foi alocada dinamicamente. Se foi alocado estaticamente, não pode ser realocado [com segurança]. *

Os ponteiros mantêm endereços de dados na memória. Eles podem ser alocados, desalocados e realocados dinamicamente usando os operadores new/delete em C ++ e malloc/free em C.

Sugiro que você leia A linguagem de programação C por Kernighan e Ritchie e um sólido texto em C ++ como C ++ a partir do zero por Herbert Schildt.

Usando memória dinâmica, ponteiros, offsets, etc são fundamentais para o uso desses dois idiomas. Não saber como eles funcionam e por que eles existem será uma provável razão para os possíveis empregadores recusarem.

* o compilador não deve deixar você realocar qualquer coisa que tenha sido alocada estaticamente, mas se isso acontecer, o comportamento é indefinido

8
adicionado
Eu não vi o seu Annotated C Standard - então eu não posso comentar diretamente, mas eu usei o livro Ground Up nas aulas, e achei os alunos realmente 'pegarem' usando esse texto
adicionado o autor warren, fonte
O C ++ de Schildt é melhor que o seu 'Padrão C Anotado'?
adicionado o autor Jonathan Leffler, fonte

O fraseado é um pouco estranho, mas para mim parece que a questão da entrevista foi uma questão aberta para que você explique o que você sabe sobre matrizes, ponteiros, alocação dinâmica de memória, etc. Se eu fosse o entrevistador eu iria querer o candidato para articular as diferenças entre int * a = malloc (10 * sizeof (int)); e int a [10]; . A pergunta seguinte não está muito bem formulada, mas provavelmente foi uma tentativa de empurrar o candidato na direção da diferença entre um ponteiro e um arranjo e desencadear a linha de pensamento.

5
adicionado

ESTÁ BEM. Você não pode realocar uma matriz que tenha sido declarada estaticamente. O objetivo de usar ponteiros (em vez de matriz declarada estaticamente) seria para que você possa realocar o espaço. Eu acho que, para ser tecnicamente correto, você poderia realocar um array estaticamente definido passando um ponteiro para ele, mas eu não gostaria. O comportamento é indefinido se o ponteiro estiver na memória que não foi alocada pelo malloc.

2
adicionado
A função realloc nos permite aumentar ou diminuir o tamanho de uma área alocada anteriormente (o uso mais comum é aumentar uma área). Por exemplo, se alocarmos espaço para 512 elementos em uma matriz que preenchemos no tempo de execução, mas achamos que precisamos de espaço para mais de 512 elementos, podemos chamar realloc.
adicionado o autor iankits, fonte
linux.die.net/man/3/realloc - ainda não ajudará itens alocados estaticamente
adicionado o autor warren, fonte

Eu realmente não entendo como usar ponteiros "desperdiça memória". A função realloc: -

void *realloc(void *ptr, size_t size);

Leva um ponteiro para a memória para redimensionar como um parâmetro. Além disso, há muito mais usos para ponteiros do que memória dinâmica, passando por referência, por exemplo.

1
adicionado
"desperdiça memória" pode significar que int * ra = malloc (10 * sizeof (int)); resulta no uso de mais armazenamento que int ra [10]; devido à sobrecarga de sua implementação malloc. Mas há motivos melhores para usar arrays na pilha, quando aplicável.
adicionado o autor Steve Jessop, fonte
Ah, e quando a matriz pertence a algo representado por uma struct, há a memória óbvia "desperdiçada" que armazenar um ponteiro para a matriz, em vez de apenas incorporar a matriz na estrutura e acessando pelo nome do membro, usa um tamanho extra *) bytes.
adicionado o autor Steve Jessop, fonte