2017-02-25 3 views
0

Ich versuche, in ein Byte zu schreiben, das ich unter Verwendung malloc() zugewiesen habe. Ich habe wirklich Probleme damit, die Bits und Werte korrekt auszudrucken.Drucken und Schreiben über Bytes

int main(){ 

    unsigned char *heap = (unsigned char *) malloc(2 * sizeof(char)); //allocate two bytes 

    int n= 2, i =0; 
    unsigned char* byte_array = heap; 

    while (i < 2) //trying to write over the first byte then print out to verify 
    { 
     printf("%016X\n", heap[i]); 
     heap[i] = "AAA"; 
     printf("%p\n", heap[i]); 
     i++; 
    } 
} 

Dies ist die Ausgabe ich

0000000000000000 
0xc7 
0000000000000000 
0xc7 
+4

Was erwarten Sie 'heap [i] =" AAA "zu tun? '" AAA "' ist kein 'unsigned char'. – Ryan

+0

Wo soll ich anfangen? Dein Compiler sollte vor 'heap [i] =" AAA "warnen;' - du versuchst, einem 'unsigned char' ein' char * 'zuzuweisen. Das zeigt, dass Sie ein Problem haben. Sie versuchen, 'heap [i]' als Zeiger zu drucken, aber es ist kein Zeiger, es ist ein 'unsigned char'. Sie können es sich nicht leisten, Warnungen zu ignorieren, die Ihr Compiler Ihnen gibt - in diesem Stadium Ihrer Karriere sind das alles Fehler in Ihrem Code (oder Ihrem Verständnis des Codes). Auch später sind sie Fehler; Sie werden keine Fragen mehr zu SO mehr auslösen. –

+0

War es sinnvoll, in diesem Post "byte_array" zu behalten? – WhozCraig

Antwort

0

bekommen Um zu verstehen Unterschied zwischen "String" und 'c' Charakter in C. Versuchen Sie diesen Code:

#include <stdio.h> 

int main(){ 

    /* Usual way */ 
    char *a = "A"; 
    char *b = "B"; 
    char *c = "C"; 

    printf("Address of a = 0x%x\n",a); 
    printf("Address of b = 0x%x\n",b); 
    printf("Address of c = 0x%x\n",c); 

    /* Explicit way - Because you asked above question */ 
    printf("This is Base Address of String A = 0x%x\n","A"); 
    printf("This is Base Address of string B = 0x%x\n","B"); 
    printf("This is Base Address of string C = 0x%x\n","C"); 

    /* Now, let us print content - The usual way */ 
    printf("Pointer value a has %x\n",*a); 
    printf("Pointer value b has %x\n",*b); 
    printf("Pointer value c has %x\n",*c); 

    /* The unusual way */ 
    printf("Value of String A %x\n",*"A"); 
    printf("Value of String B %x\n",*"B"); 
    printf("Value of String C %x\n",*"C"); 

} 

Die oben Der Code erzeugt eine Compiler-Warnung, weil char * als unsigned int formatiert ist, aber ignoriert es einfach, um das Beispiel zu verstehen.

Der Ausgang würde aussehen wie folgt:

Address of a = 0xedfce4a 
Address of b = 0xedfce4c 
Address of c = 0xedfce4e 
This is Base Address of String A = 0xedfce4a 
This is Base Address of string B = 0xedfce4c 
This is Base Address of string C = 0xedfce4e 
Pointer value a has 41 
Pointer value b has 42 
Pointer value c has 43 
Value of String A 41 
Value of String B 42 
Value of String C 43 
0

Zunächst einmal einige Operationen tun, ohne wirklich die Bedeutung zu wissen:

while (i < 2) 
{ 
    printf("%016X\n", heap[i]); // You're printing the value of heap[i] in hexadecimal that 
           // is not even setted 
    heap[i] = "AAA";   // This operation has no sense, 'cause a 
           // "char" can only contain 1 character 


    printf("%p\n", heap[i]); // You are printing a pointer, why? 
    i++; 
} 

Die char in C nur ein Zeichen enthalten. So hat dies einen Sinn:

char a = 'b'; 

und wenn Sie eine Zeichenfolge haben wollen, müssen Sie eine Reihe von Zeichen:

char * a = "AAA"; 

Weitere lesen here

So würde ich den Code neu schreiben in auf diese Weise:

while (i < 2){ 
    printf("First: %c\n",heap[i]); 
    heap[i] = 'a'; 
    printf("After: %c\n",heap[i]); 
    i++; 
} 
Verwandte Themen