2010-11-08 9 views
9

Tengo un puntero que apunta al inicio de una matriz, pero necesito verificar que no esté asignado. Pensé en quitarle la referencia al puntero y verificar si es NULO, pero eso lleva a un error de tipo. ¿Alguien puede ver lo que estoy haciendo mal?Puntero que apunta a una matriz vacía

int mydispose(int *array){ 
    int i = 0; 

    if(*array == NULL){ 
      return 1; 
    } 

    return ; 

}

EDIT: Lo siento si yo era claro: tengo un puntero que apunta al inicio de una matriz, pero me gustaría comprobar si la matriz está vacía.

+11

-1? La pregunta muestra una falta de comprensión, pero ese es el punto de hacer preguntas. El código está formateado y la pregunta es clara. Si vas a vengar a alguien, al menos di por qué. – nmichaels

Respuesta

11

*array == NULL es incorrecto. Está desreferenciando el puntero primero (lo que podría conducir a un segfault si el puntero realmente es nulo) y luego comparando su valor int con un valor de puntero. Además, su compilador aceptará perfectamente esa expresión errónea si NULL se define como 0 y no (void *) 0.

Debe comprobar array == NULL para ver si el puntero pasado se refiere a algo, y luego desreferenciarlo solo en caso de que no sea NULL.

Tenga en cuenta, sin embargo, que eliminar la referencia de un puntero no nulo no garantiza que sea una operación segura tampoco. Si el puntero contiene un valor de basura porque se asignó en la pila y no se inicializó, o si se refiere a una región de memoria desasignada, pueden ocurrir errores desagradables.

+0

Gracias, esto es lo que había pensado originalmente, pero ¿esto no solo me muestra que tengo un puntero nulo, en lugar de un puntero que apunta a una matriz vacía? – Alex

+2

No existe una matriz vacía en C: al pasar matrices a funciones, siempre debe pasar un número que indique la longitud. Si ese número es cero, podría tratar la matriz como vacía. Existe la noción, sin embargo, de una cadena vacía, porque por convención las cadenas están delimitadas con un carácter cero al final. Si el primer carácter es cero, se considera una cadena vacía. –

+0

Bien, gracias BB, ¿entonces quizás debería probar por cero? Estoy reescribiendo malloc(), "Esta función devolverá 1 si la matriz tiene la forma de una estructura correctamente inicializada sin bloques actualmente asignados, de lo contrario devolverá 0." – Alex

5

Quiere if (array == NULL) - pero, a menos que inicialice primero array en NULL, tampoco servirá de nada. Creo que será mejor que retroceda y nos cuente un poco más sobre lo que está tratando de lograr, y trate de obtener ayuda para lograr su objetivo general.

+0

Esto. * "... Sé que necesito hacer Foo, pero no entiendo cómo ..." * a menudo es una señal de que * no * necesitas hacer Foo, sino algo completamente diferente. – dmckee

+0

@dmckee: Sí, exactamente. Esto es especialmente probable cuando/si 'Foo' es algo que casi nadie necesita hacer ... –

0

Debe utilizar de esta manera:

if(array == NULL) ... 
1

La única forma segura de determinar el estado de asignación de *array es:

  1. Asegúrese *array se establece en NULL no se asigna. int *array = NULL;
  2. Comprobar si la matriz es NULL: if (array == NULL) return -1;
1

no se puede comprobar de forma fiable si se asigna algún lugar de la memoria. *array no es un código válido, porque es lo mismo que array[0], pero array[0] no está asignado. La ubicación de memoria no asignada puede contener cualquier valor.

La única opción es asegurarse de obtener la información si la matriz se asigna junto con su matriz. Una opción popular es representar una matriz no asignada como NULL, pero también puede elegir otra opción.

Por cierto, hay una diferencia entre una matriz vacía (es decir, una matriz de tamaño 0) y una matriz que no está asignada en absoluto. La primera opción ocurre cuando usa malloc(0), la segunda cuando su puntero no se inicializa en absoluto. Para malloc(0), puede devolver NULL, pero puede devolver un puntero que no sea NULL (que, sin embargo, no puede desreferencia). Ambas formas son válidas de acuerdo con el estándar.

1

El problema inmediato con su código es que desreferencia array antes de compararlo a NULL. El tipo de la expresión *array es int, no int *. Dejar fuera el operador eliminar la referencia y los tipos coincidirán:

if (array == NULL) {...} 

Tenga en cuenta que un puntero no inicializado sólo se garantiza para contener NULL si se declara con medida estática (es decir, se declaró ya sea en el ámbito de archivo o con la palabra clave static en frente de eso). Del mismo modo, llamando al free en un puntero no establecerá ese valor del puntero en NULL; contendrá el mismo valor de puntero que antes, pero ahora no será válido.

Cuestiones relacionadas