|
@ -1,11 +1,16 @@ |
|
|
#include <stdlib.h> |
|
|
#include <stdlib.h> |
|
|
#include <stdio.h> |
|
|
#include <stdio.h> |
|
|
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void displayArray(int arr[], size_t size); |
|
|
void displayArray(int arr[], size_t size); |
|
|
void displayArrayPtr(int *arr, size_t size); |
|
|
void displayArrayPtr(int *arr, size_t size); |
|
|
int safeCompare(const void *a, const void *b, size_t asize, size_t bsize); |
|
|
int safeCompare(const void *a, const void *b, size_t asize, size_t bsize); |
|
|
int valid(void *p); |
|
|
int valid(void *p); |
|
|
|
|
|
void display2DArray(int arr[][5], size_t rows); |
|
|
|
|
|
void display2DArrayPtr(int (*arr)[5], size_t rows); |
|
|
|
|
|
void display2DArrayUnknownSize(int *arr, size_t rows, size_t cols); |
|
|
|
|
|
void display3DArrayPtr(int (*arr)[2][4], size_t rows); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void displayArray(int arr[], size_t size) { |
|
|
void displayArray(int arr[], size_t size) { |
|
@ -33,12 +38,61 @@ int safeCompare(const void *a, const void *b, size_t asize, size_t bsize) { |
|
|
int value = 0; |
|
|
int value = 0; |
|
|
for (size_t i = 0; i < asize; i++) { |
|
|
for (size_t i = 0; i < asize; i++) { |
|
|
//value |= a[i] ^ b[i]; |
|
|
//value |= a[i] ^ b[i]; |
|
|
value |= ((char*) a)[i] ^ ((char*) b)[i]; |
|
|
|
|
|
|
|
|
value |= ((unsigned char*) a)[i] ^ ((unsigned char*) b)[i]; |
|
|
} |
|
|
} |
|
|
return value; |
|
|
return value; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void display2DArray(int arr[][5], size_t rows) { |
|
|
|
|
|
for (size_t i = 0; i < rows; i++) { |
|
|
|
|
|
for (size_t j = 0; j < 5; j++) { |
|
|
|
|
|
printf("%d", arr[i][j]); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void display2DArrayPtr(int (*arr)[5], size_t rows) { |
|
|
|
|
|
for (size_t i = 0; i < rows; i++) { |
|
|
|
|
|
for (size_t j = 0; j < 5; j++) { |
|
|
|
|
|
printf("%d", *(arr[i] + j)); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void display2DArrayUnknownSize(int *arr, size_t rows, size_t cols) { |
|
|
|
|
|
for (size_t i = 0; i < rows; i++) { |
|
|
|
|
|
for (size_t j = 0; j < cols; j++) { |
|
|
|
|
|
// both are equivalent |
|
|
|
|
|
//printf("%d", *(arr + (i * cols) + j)); |
|
|
|
|
|
printf("%d", (arr + (i * cols))[j]); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void display3DArrayPtr(int (*arr)[2][4], size_t rows) { |
|
|
|
|
|
for (size_t i = 0; i < rows; i++) { |
|
|
|
|
|
for (size_t j = 0; j < 2; j++) { |
|
|
|
|
|
printf("{"); |
|
|
|
|
|
for (size_t k = 0; k < 4; k++) { |
|
|
|
|
|
printf("%d", arr[i][j][k]); |
|
|
|
|
|
if (k != 3) { |
|
|
|
|
|
printf(" "); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
printf("}"); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(void) { |
|
|
int main(void) { |
|
|
|
|
|
|
|
|
int vector[5] = {1,2,3,4,5}; |
|
|
int vector[5] = {1,2,3,4,5}; |
|
@ -80,6 +134,7 @@ int main(void) { |
|
|
for(size_t index = 0; index < 5; index++) { |
|
|
for(size_t index = 0; index < 5; index++) { |
|
|
printf("pv[%zu]: %d\n", index, pv[index]); |
|
|
printf("pv[%zu]: %d\n", index, pv[index]); |
|
|
} |
|
|
} |
|
|
|
|
|
free(pv); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// passing array to function using array notation |
|
|
// passing array to function using array notation |
|
@ -101,8 +156,12 @@ int main(void) { |
|
|
//**(arr + i) = i; |
|
|
//**(arr + i) = i; |
|
|
printf("%d\n", **(arr + i)); |
|
|
printf("%d\n", **(arr + i)); |
|
|
} |
|
|
} |
|
|
|
|
|
for (size_t i = 0; i < 5; i++) { |
|
|
|
|
|
free(arr[i]); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// pointers and multidimensional arrays |
|
|
// pointers and multidimensional arrays |
|
|
{ |
|
|
{ |
|
|
// declare a 2-dimensional array |
|
|
// declare a 2-dimensional array |
|
@ -125,6 +184,125 @@ int main(void) { |
|
|
printf("%p %d\n", matrix[0] + 1, *(matrix[0] + 1)); |
|
|
printf("%p %d\n", matrix[0] + 1, *(matrix[0] + 1)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// passing a multidimensional array |
|
|
|
|
|
{ |
|
|
|
|
|
// declare a 2-dimensional array |
|
|
|
|
|
int matrix[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}; |
|
|
|
|
|
|
|
|
|
|
|
display2DArray(matrix, 2); |
|
|
|
|
|
display2DArrayPtr(matrix, 2); |
|
|
|
|
|
display2DArrayUnknownSize(&matrix[0][0], |
|
|
|
|
|
sizeof(matrix) / sizeof(matrix[0]), |
|
|
|
|
|
sizeof(matrix[0]) / sizeof(*matrix[0])); |
|
|
|
|
|
|
|
|
|
|
|
int arr3D[][2][4] = { |
|
|
|
|
|
{{1, 2, 3, 4}, {5, 6, 7, 8}}, |
|
|
|
|
|
{{9, 10, 11, 12}, {13, 14, 15, 16}}, |
|
|
|
|
|
{{17, 18, 19, 20}, {21, 22, 23, 24}} |
|
|
|
|
|
}; |
|
|
|
|
|
display3DArrayPtr(arr3D, 3); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// dynamically allocating a two-dimensional array |
|
|
|
|
|
{ |
|
|
|
|
|
// allocating contigously memory |
|
|
|
|
|
int matrix[2][5] = {{1, 2, 3, 4, 6}, {6, 7, 8, 9, 10}}; |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < 2; i++) { |
|
|
|
|
|
for (size_t j = 0; j < 5; j++) { |
|
|
|
|
|
printf("matrix[%zu][%zu] Address: %p Value: %d\n", i, j, &matrix[i][j], matrix[i][j]); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// allocating potential noncontiguous memory |
|
|
|
|
|
{ |
|
|
|
|
|
size_t rows = 2; |
|
|
|
|
|
size_t cols = 5; |
|
|
|
|
|
|
|
|
|
|
|
int **matrix = malloc(rows * sizeof(int *)); |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < rows; i++) { |
|
|
|
|
|
matrix[i] = malloc(cols * sizeof(int)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
free(matrix); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// allocating contiguous memory |
|
|
|
|
|
{ |
|
|
|
|
|
size_t rows = 2; |
|
|
|
|
|
size_t cols = 5; |
|
|
|
|
|
|
|
|
|
|
|
int **matrix = malloc(rows * sizeof(int*)); |
|
|
|
|
|
|
|
|
|
|
|
matrix[0] = malloc(rows * cols * sizeof(int)); |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 1; i < rows; i++) { |
|
|
|
|
|
matrix[i] = matrix[0] + i * cols; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
free(matrix); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// allocating contiguous memory |
|
|
|
|
|
{ |
|
|
|
|
|
size_t rows = 2; |
|
|
|
|
|
size_t cols = 5; |
|
|
|
|
|
|
|
|
|
|
|
int *matrix = malloc(rows * cols * sizeof(int)); |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < rows; i++) { |
|
|
|
|
|
for (size_t j = 0; j < cols; j++) { |
|
|
|
|
|
*(matrix + (i * cols) + j) = i * j; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
free(matrix); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// jagged arrays and pointers |
|
|
|
|
|
{ |
|
|
|
|
|
// 2 dimensional array with compound literals |
|
|
|
|
|
int *arr1[] = { |
|
|
|
|
|
(int[]) {0, 1, 2}, |
|
|
|
|
|
(int[]) {3, 4, 5}, |
|
|
|
|
|
(int[]) {6, 7, 8} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < 3; i++) { |
|
|
|
|
|
for (size_t j = 0; j < 3; j++) { |
|
|
|
|
|
printf("arr1[%zu][%zu] Address: %p Value: %d\n", i, j, &arr1[i][j], arr1[i][j]); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 2 dimensinal jagged array with compound literals |
|
|
|
|
|
int *arr2[] = { |
|
|
|
|
|
(int[]) {0, 1, 2, 3}, |
|
|
|
|
|
(int[]) {4, 5}, |
|
|
|
|
|
(int[]) {6, 7, 8} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < 4; i++) { |
|
|
|
|
|
printf("arr2[0][%zu] Address: %p Value: %d\n", i, &arr2[0][i], *(arr2[0] + i)); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
for (size_t i = 0; i < 2; i++) { |
|
|
|
|
|
printf("arr2[1][%zu] Address: %p Value: %d\n", i, &arr2[1][i], *(arr2[1] + i)); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
for (size_t i = 0; i < 3; i++) { |
|
|
|
|
|
printf("arr2[2][%zu] Address: %p Value: %d\n", i, &arr2[2][i], arr2[2][i]); |
|
|
|
|
|
} |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// test safeCompare function |
|
|
// test safeCompare function |
|
|
{ |
|
|
{ |
|
|
// test with char parameters |
|
|
// test with char parameters |
|
@ -146,6 +324,27 @@ int main(void) { |
|
|
} else { |
|
|
} else { |
|
|
printf("%s gleich %s\n", "bla", "bli"); |
|
|
printf("%s gleich %s\n", "bla", "bli"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// test with unsigned char parameters |
|
|
|
|
|
unsigned char blar[] = {0x00, 0x01, 0x02, 0x03, 0x04}; |
|
|
|
|
|
unsigned char blir[] = {0x00, 0x01, 0x02, 0x03, 0x04}; |
|
|
|
|
|
|
|
|
|
|
|
if(safeCompare(blar, blir, sizeof(blar), sizeof(blir))) { |
|
|
|
|
|
printf("%s ungleich %s\n", "blar", "blir"); |
|
|
|
|
|
} else { |
|
|
|
|
|
printf("%s gleich %s\n", "blar", "blir"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// test with unsigned char |
|
|
|
|
|
unsigned char blab = 0x00; |
|
|
|
|
|
unsigned char blib = 0x01; |
|
|
|
|
|
|
|
|
|
|
|
if(safeCompare(&blab, &blib, sizeof(blab), sizeof(blib))) { |
|
|
|
|
|
printf("%s ungleich %s\n", "blar", "blir"); |
|
|
|
|
|
} else { |
|
|
|
|
|
printf("%s gleich %s\n", "blar", "blir"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return 0; |
|
|
return 0; |
|
|