Może ten kod trochę wyjaśni sytuację:
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#define STRING "string"
int StringCompare(uint8_t Buf){
printf("Buf: %p\n",Buf);
char *Data = (char *)Buf;
char *string = STRING;
return strcmp(Data,string);
}
int StringCompare2(uint8_t *Buf){
printf("Buf: %p\n",Buf);
char *Data = (char *)Buf;
char *string = STRING;
return strcmp(Data,string);
}
void print_equal_message(int equal){
if(equal == 0){
printf("String are equal");
}else{
printf("String are not equal");
}
printf("\n");
}
int main(){
uint8_t to_check_bad[] = "some text";
uint8_t to_check_good[] = STRING;
printf("Test compare for StringCompare2\n");
print_equal_message(StringCompare2(to_check_bad));
print_equal_message(StringCompare2(to_check_good));
printf("Test compare for StringCompare\n");
print_equal_message(StringCompare(to_check_bad));
print_equal_message(StringCompare(to_check_good));
return 0;
}
Na poziomie kompilacji:
$ gcc -Wall -pedantic ./c_equal.c
./c_equal.c: In function ‘StringCompare’:
./c_equal.c:9:16: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’ [-Wformat=]
printf("Buf: %p\n",Buf);
^
./c_equal.c:10:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
char *Data = (char *)Buf;
^
./c_equal.c: In function ‘main’:
./c_equal.c:40:36: warning: passing argument 1 of ‘StringCompare’ makes integer from pointer without a cast [-Wint-conversion]
print_equal_message(StringCompare(to_check_bad));
^~~~~~~~~~~~
./c_equal.c:8:5: note: expected ‘uint8_t {aka unsigned char}’ but argument is of type ‘uint8_t * {aka unsigned char *}’
int StringCompare(uint8_t Buf){
^~~~~~~~~~~~~
./c_equal.c:41:36: warning: passing argument 1 of ‘StringCompare’ makes integer from pointer without a cast [-Wint-conversion]
print_equal_message(StringCompare(to_check_good));
^~~~~~~~~~~~~
./c_equal.c:8:5: note: expected ‘uint8_t {aka unsigned char}’ but argument is of type ‘uint8_t * {aka unsigned char *}’
int StringCompare(uint8_t Buf){
^~~~~~~~~~~~~
po uruchomieniu:
$ ./a.out
Test compare for StringCompare2
Buf: 0xbfd9e176
String are not equal
Buf: 0xbfd9e16f
String are equal
Test compare for StringCompare
Buf: 0x76
Naruszenie ochrony pamięci