Parece que está confundido entre punteros y matrices. Punteros y arrays (en este caso char *
y char []
) son not the same thing.
- Una matriz
char a[SIZE]
dice que el valor en la posición de a
es una matriz de longitud SIZE
- Un puntero
char *a;
dice que el valor en la ubicación de a
es un puntero a char
. Esto se puede combinar con la aritmética de punteros a comportarse como una matriz (por ejemplo, a[10]
es 10 entradas anteriores donde a
puntos)
En la memoria, parece que este (ejemplo tomado de the FAQ):
char a[] = "hello"; // array
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
char *p = "world"; // pointer
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
Es fácil confundirse acerca de la diferencia entre punteros y matrices, porque en muchos casos, una referencia de matriz "se descompone" en un puntero a su primer elemento. Esto significa que en muchos casos (como cuando se pasa a una llamada a función) las matrices se convierten en punteros. Si desea saber más, this section of the C FAQ describes the differences in detail.
Una diferencia práctica importante es que el compilador sabe cuánto tiempo es una matriz. Siguiendo los ejemplos anteriores:
char a[] = "hello";
char *p = "world";
sizeof(a); // 6 - one byte for each character in the string,
// one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
// probably 4 or 8 on most machines (depending on whether it's a
// 32 or 64 bit machine)
Sin ver su código, es difícil recomendar el mejor curso de acción, pero sospecho cambiando utilizar punteros de todo el mundo va a resolver los problemas que estás teniendo.Tome nota de que ahora:
Deberá inicializar la memoria donde quiera que estén las matrices. Por ejemplo, char a[10];
se convertirá en char *a = malloc(10 * sizeof(char));
, seguido por un cheque que a != NULL
. Tenga en cuenta que en realidad no necesita decir sizeof(char)
en este caso, porque sizeof(char)
se define como 1. Lo dejé para completarlo.
En cualquier lugar que previamente había sizeof(a)
para la longitud de la matriz tendrá que ser reemplazado por la longitud de la memoria que asigna (si está usando cuerdas, se puede usar strlen()
, que cuenta hasta el '\0'
).
Necesitará hacer una llamada correspondiente al free()
para cada llamada al malloc()
. Esto le dice a la computadora que ha terminado de usar la memoria que solicitó con malloc()
. Si su puntero es a
, solo escriba free(a);
en un punto del código donde sepa que ya no necesita los puntos a
.
Como otra respuesta ha señalado, si desea obtener la dirección del inicio de una matriz, puede utilizar:
char* p = &a[0]
usted puede leer esto como "puntero char p
convierte en la dirección del elemento [0]
de a
".
Lea la sección 6 de las [preguntas frecuentes comp.lang.c] (http://c-faq.com/). –