Strange symbols being printed in string C
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I'm new to C programming, but what I'm trying to do is create a BST using arrays. Here is my code for the headers that I am using:
bst.h
#ifndef ASSIGNMENT4_BST_H
#define ASSIGNMENT4_BST_H
// ====== this is in bst.h
#include "data.h"
typedef struct Node *tree_nodes; unsigned char *is_free; int size; BStree_struct;
typedef BStree_struct* BStree;
BStree bstree_ini(int size);
void bstree_insert(BStree bst, Key *key, int data);
void bstree_traversal(BStree bst);
void bstree_free(BStree bst);
#endif //ASSIGNMENT4_BST_H
data.h
#ifndef ASSIGNMENT4_DATA_H
#define ASSIGNMENT4_DATA_H
typedef struct char *name; int id; Key;
typedef struct Key *key; int data; Node;
Key *key_construct(char *in_name, int in_id);
int key_comp(Key key1, Key key2);
void print_key(Key *key);
void print_node(Node node);
#endif //ASSIGNMENT4_DATA_H
And here is the code for my actual source files:
bst.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"
// Input: ’size’: size of an array
// Output: a pointer of type BStree,
// i.e. a pointer to an allocated memory of BStree_struct type
// Effect: dynamically allocate memory of type BStree_struct
// allocate memory for a Node array of size+1 for member tree_nodes
// allocate memory for an unsigned char array of size+1 for member is_free
// set all entries of is_free to 1
// set member size to ’size’;
void bstree_insert_helper (BStree, Key *, int, int);
BStree bstree_ini(int size)
BStree bstree = (BStree*) malloc(sizeof(BStree));
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
for (int i = 0 ; i < size; i++)
// printf("%c", bstree->is_free[i]);
return bstree;
// Input: ’bst’: a binary search tree
// ’key’: a pointer to Key
// ’data’: an integer
// Effect: ’data’ with ’key’ is inserted into ’bst’
// if ’key’ is already in ’bst’, do nothing
void bstree_insert(BStree bst, Key *key, int data)
bstree_insert_helper(bst, key, data, 1);
void bstree_insert_helper (BStree bst, Key *key, int data, int index)
if (bst->is_free[index] == '1')
bst->tree_nodes[index].key = key;
bst->tree_nodes[index].data = data;
bst->is_free[index] = '0';
else
int value = key_comp(*key, *bst->tree_nodes[index].key);
if (value < 0)
int newIndex = 2*index;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else if (value > 0)
int newIndex = 2*index+1;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else
puts("Key already exists... Aborting");
int main ()
BStree bsTree = bstree_ini(10);
bstree_insert_helper(bsTree, key_construct("Ilya", 1), 11, 1);
bstree_insert_helper(bsTree, key_construct("Covin", 2), 12, 1);
bstree_insert_helper(bsTree, key_construct("adolf", 3), 13, 1);
bstree_insert_helper(bsTree, key_construct("henlo", 4), 14, 1);
print_node(bsTree->tree_nodes[1]);
return 0;
data.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "data.h"
// Input: ’in_name’: a string ends with ’’
// ’in_id’: an integer
// Output: a pointer of type pointer to Key,
// pointing to an allocated memory containing a Key
// Effect: dynamically allocate memory to hold a Key
// set Key’s id to be in_id
// dynamically allocate memory for the Key’s name
// so that name will contain what is in ’in_name’.
// Note: may use strdup()
Key *key_construct(char *in_name, int in_id)
Key *key = (Key*) malloc(sizeof(Key));
key->name = strdup(in_name);
key->id = in_id;
return key;
// Input: ’key1’ and ’key2’ are two Keys
// Output: if return value < 0, then key1 < key2,
// if return value = 0, then key1 = key2,
// if return value > 0, then key1 > key2,
// Note: use strcmp() to compare key1.name and key2.name
// if key1.name = key2.name, then compare key1.id with key2.id
int key_comp(Key key1, Key key2)
// Input: ’key’: a pointer to Key
// Effect: ( key->name key->id ) is printed
void print_key(Key *key)
char *name = key->name;
int id = key->id;
printf("%s, %i", name, id);
// Input: ’node’: a node
// Effect: node.key is printed and then the node.data is printed
void print_node(Node node)
printf("%s, %d n", node.key->name, node.data);
The issue is that when I run the print_node function in main in bst.c, I expect it to print the key.name and data for indices 1,2,3, and 7 in the array properly. However, the key.name for indices 1 and 3 are not printed properly. Instead, I get a bunch of gibberish that looks something like this - 0+@]�, 11
if I used print_node(bsTree->tree_nodes[1])
. I have a feeling it has something to do with me incorrectly allocating memory for the keys in data.c but I cannot figure out exactly what I'm doing wrong.
c
add a comment |
I'm new to C programming, but what I'm trying to do is create a BST using arrays. Here is my code for the headers that I am using:
bst.h
#ifndef ASSIGNMENT4_BST_H
#define ASSIGNMENT4_BST_H
// ====== this is in bst.h
#include "data.h"
typedef struct Node *tree_nodes; unsigned char *is_free; int size; BStree_struct;
typedef BStree_struct* BStree;
BStree bstree_ini(int size);
void bstree_insert(BStree bst, Key *key, int data);
void bstree_traversal(BStree bst);
void bstree_free(BStree bst);
#endif //ASSIGNMENT4_BST_H
data.h
#ifndef ASSIGNMENT4_DATA_H
#define ASSIGNMENT4_DATA_H
typedef struct char *name; int id; Key;
typedef struct Key *key; int data; Node;
Key *key_construct(char *in_name, int in_id);
int key_comp(Key key1, Key key2);
void print_key(Key *key);
void print_node(Node node);
#endif //ASSIGNMENT4_DATA_H
And here is the code for my actual source files:
bst.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"
// Input: ’size’: size of an array
// Output: a pointer of type BStree,
// i.e. a pointer to an allocated memory of BStree_struct type
// Effect: dynamically allocate memory of type BStree_struct
// allocate memory for a Node array of size+1 for member tree_nodes
// allocate memory for an unsigned char array of size+1 for member is_free
// set all entries of is_free to 1
// set member size to ’size’;
void bstree_insert_helper (BStree, Key *, int, int);
BStree bstree_ini(int size)
BStree bstree = (BStree*) malloc(sizeof(BStree));
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
for (int i = 0 ; i < size; i++)
// printf("%c", bstree->is_free[i]);
return bstree;
// Input: ’bst’: a binary search tree
// ’key’: a pointer to Key
// ’data’: an integer
// Effect: ’data’ with ’key’ is inserted into ’bst’
// if ’key’ is already in ’bst’, do nothing
void bstree_insert(BStree bst, Key *key, int data)
bstree_insert_helper(bst, key, data, 1);
void bstree_insert_helper (BStree bst, Key *key, int data, int index)
if (bst->is_free[index] == '1')
bst->tree_nodes[index].key = key;
bst->tree_nodes[index].data = data;
bst->is_free[index] = '0';
else
int value = key_comp(*key, *bst->tree_nodes[index].key);
if (value < 0)
int newIndex = 2*index;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else if (value > 0)
int newIndex = 2*index+1;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else
puts("Key already exists... Aborting");
int main ()
BStree bsTree = bstree_ini(10);
bstree_insert_helper(bsTree, key_construct("Ilya", 1), 11, 1);
bstree_insert_helper(bsTree, key_construct("Covin", 2), 12, 1);
bstree_insert_helper(bsTree, key_construct("adolf", 3), 13, 1);
bstree_insert_helper(bsTree, key_construct("henlo", 4), 14, 1);
print_node(bsTree->tree_nodes[1]);
return 0;
data.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "data.h"
// Input: ’in_name’: a string ends with ’’
// ’in_id’: an integer
// Output: a pointer of type pointer to Key,
// pointing to an allocated memory containing a Key
// Effect: dynamically allocate memory to hold a Key
// set Key’s id to be in_id
// dynamically allocate memory for the Key’s name
// so that name will contain what is in ’in_name’.
// Note: may use strdup()
Key *key_construct(char *in_name, int in_id)
Key *key = (Key*) malloc(sizeof(Key));
key->name = strdup(in_name);
key->id = in_id;
return key;
// Input: ’key1’ and ’key2’ are two Keys
// Output: if return value < 0, then key1 < key2,
// if return value = 0, then key1 = key2,
// if return value > 0, then key1 > key2,
// Note: use strcmp() to compare key1.name and key2.name
// if key1.name = key2.name, then compare key1.id with key2.id
int key_comp(Key key1, Key key2)
// Input: ’key’: a pointer to Key
// Effect: ( key->name key->id ) is printed
void print_key(Key *key)
char *name = key->name;
int id = key->id;
printf("%s, %i", name, id);
// Input: ’node’: a node
// Effect: node.key is printed and then the node.data is printed
void print_node(Node node)
printf("%s, %d n", node.key->name, node.data);
The issue is that when I run the print_node function in main in bst.c, I expect it to print the key.name and data for indices 1,2,3, and 7 in the array properly. However, the key.name for indices 1 and 3 are not printed properly. Instead, I get a bunch of gibberish that looks something like this - 0+@]�, 11
if I used print_node(bsTree->tree_nodes[1])
. I have a feeling it has something to do with me incorrectly allocating memory for the keys in data.c but I cannot figure out exactly what I'm doing wrong.
c
add a comment |
I'm new to C programming, but what I'm trying to do is create a BST using arrays. Here is my code for the headers that I am using:
bst.h
#ifndef ASSIGNMENT4_BST_H
#define ASSIGNMENT4_BST_H
// ====== this is in bst.h
#include "data.h"
typedef struct Node *tree_nodes; unsigned char *is_free; int size; BStree_struct;
typedef BStree_struct* BStree;
BStree bstree_ini(int size);
void bstree_insert(BStree bst, Key *key, int data);
void bstree_traversal(BStree bst);
void bstree_free(BStree bst);
#endif //ASSIGNMENT4_BST_H
data.h
#ifndef ASSIGNMENT4_DATA_H
#define ASSIGNMENT4_DATA_H
typedef struct char *name; int id; Key;
typedef struct Key *key; int data; Node;
Key *key_construct(char *in_name, int in_id);
int key_comp(Key key1, Key key2);
void print_key(Key *key);
void print_node(Node node);
#endif //ASSIGNMENT4_DATA_H
And here is the code for my actual source files:
bst.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"
// Input: ’size’: size of an array
// Output: a pointer of type BStree,
// i.e. a pointer to an allocated memory of BStree_struct type
// Effect: dynamically allocate memory of type BStree_struct
// allocate memory for a Node array of size+1 for member tree_nodes
// allocate memory for an unsigned char array of size+1 for member is_free
// set all entries of is_free to 1
// set member size to ’size’;
void bstree_insert_helper (BStree, Key *, int, int);
BStree bstree_ini(int size)
BStree bstree = (BStree*) malloc(sizeof(BStree));
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
for (int i = 0 ; i < size; i++)
// printf("%c", bstree->is_free[i]);
return bstree;
// Input: ’bst’: a binary search tree
// ’key’: a pointer to Key
// ’data’: an integer
// Effect: ’data’ with ’key’ is inserted into ’bst’
// if ’key’ is already in ’bst’, do nothing
void bstree_insert(BStree bst, Key *key, int data)
bstree_insert_helper(bst, key, data, 1);
void bstree_insert_helper (BStree bst, Key *key, int data, int index)
if (bst->is_free[index] == '1')
bst->tree_nodes[index].key = key;
bst->tree_nodes[index].data = data;
bst->is_free[index] = '0';
else
int value = key_comp(*key, *bst->tree_nodes[index].key);
if (value < 0)
int newIndex = 2*index;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else if (value > 0)
int newIndex = 2*index+1;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else
puts("Key already exists... Aborting");
int main ()
BStree bsTree = bstree_ini(10);
bstree_insert_helper(bsTree, key_construct("Ilya", 1), 11, 1);
bstree_insert_helper(bsTree, key_construct("Covin", 2), 12, 1);
bstree_insert_helper(bsTree, key_construct("adolf", 3), 13, 1);
bstree_insert_helper(bsTree, key_construct("henlo", 4), 14, 1);
print_node(bsTree->tree_nodes[1]);
return 0;
data.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "data.h"
// Input: ’in_name’: a string ends with ’’
// ’in_id’: an integer
// Output: a pointer of type pointer to Key,
// pointing to an allocated memory containing a Key
// Effect: dynamically allocate memory to hold a Key
// set Key’s id to be in_id
// dynamically allocate memory for the Key’s name
// so that name will contain what is in ’in_name’.
// Note: may use strdup()
Key *key_construct(char *in_name, int in_id)
Key *key = (Key*) malloc(sizeof(Key));
key->name = strdup(in_name);
key->id = in_id;
return key;
// Input: ’key1’ and ’key2’ are two Keys
// Output: if return value < 0, then key1 < key2,
// if return value = 0, then key1 = key2,
// if return value > 0, then key1 > key2,
// Note: use strcmp() to compare key1.name and key2.name
// if key1.name = key2.name, then compare key1.id with key2.id
int key_comp(Key key1, Key key2)
// Input: ’key’: a pointer to Key
// Effect: ( key->name key->id ) is printed
void print_key(Key *key)
char *name = key->name;
int id = key->id;
printf("%s, %i", name, id);
// Input: ’node’: a node
// Effect: node.key is printed and then the node.data is printed
void print_node(Node node)
printf("%s, %d n", node.key->name, node.data);
The issue is that when I run the print_node function in main in bst.c, I expect it to print the key.name and data for indices 1,2,3, and 7 in the array properly. However, the key.name for indices 1 and 3 are not printed properly. Instead, I get a bunch of gibberish that looks something like this - 0+@]�, 11
if I used print_node(bsTree->tree_nodes[1])
. I have a feeling it has something to do with me incorrectly allocating memory for the keys in data.c but I cannot figure out exactly what I'm doing wrong.
c
I'm new to C programming, but what I'm trying to do is create a BST using arrays. Here is my code for the headers that I am using:
bst.h
#ifndef ASSIGNMENT4_BST_H
#define ASSIGNMENT4_BST_H
// ====== this is in bst.h
#include "data.h"
typedef struct Node *tree_nodes; unsigned char *is_free; int size; BStree_struct;
typedef BStree_struct* BStree;
BStree bstree_ini(int size);
void bstree_insert(BStree bst, Key *key, int data);
void bstree_traversal(BStree bst);
void bstree_free(BStree bst);
#endif //ASSIGNMENT4_BST_H
data.h
#ifndef ASSIGNMENT4_DATA_H
#define ASSIGNMENT4_DATA_H
typedef struct char *name; int id; Key;
typedef struct Key *key; int data; Node;
Key *key_construct(char *in_name, int in_id);
int key_comp(Key key1, Key key2);
void print_key(Key *key);
void print_node(Node node);
#endif //ASSIGNMENT4_DATA_H
And here is the code for my actual source files:
bst.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"
// Input: ’size’: size of an array
// Output: a pointer of type BStree,
// i.e. a pointer to an allocated memory of BStree_struct type
// Effect: dynamically allocate memory of type BStree_struct
// allocate memory for a Node array of size+1 for member tree_nodes
// allocate memory for an unsigned char array of size+1 for member is_free
// set all entries of is_free to 1
// set member size to ’size’;
void bstree_insert_helper (BStree, Key *, int, int);
BStree bstree_ini(int size)
BStree bstree = (BStree*) malloc(sizeof(BStree));
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
for (int i = 0 ; i < size; i++)
// printf("%c", bstree->is_free[i]);
return bstree;
// Input: ’bst’: a binary search tree
// ’key’: a pointer to Key
// ’data’: an integer
// Effect: ’data’ with ’key’ is inserted into ’bst’
// if ’key’ is already in ’bst’, do nothing
void bstree_insert(BStree bst, Key *key, int data)
bstree_insert_helper(bst, key, data, 1);
void bstree_insert_helper (BStree bst, Key *key, int data, int index)
if (bst->is_free[index] == '1')
bst->tree_nodes[index].key = key;
bst->tree_nodes[index].data = data;
bst->is_free[index] = '0';
else
int value = key_comp(*key, *bst->tree_nodes[index].key);
if (value < 0)
int newIndex = 2*index;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else if (value > 0)
int newIndex = 2*index+1;
if (bst->is_free[newIndex] == '1')
bst->tree_nodes[newIndex].key = key;
bst->tree_nodes[newIndex].data = data;
bst->is_free[newIndex] = '0';
else
bstree_insert_helper(bst, key, data, newIndex);
else
puts("Key already exists... Aborting");
int main ()
BStree bsTree = bstree_ini(10);
bstree_insert_helper(bsTree, key_construct("Ilya", 1), 11, 1);
bstree_insert_helper(bsTree, key_construct("Covin", 2), 12, 1);
bstree_insert_helper(bsTree, key_construct("adolf", 3), 13, 1);
bstree_insert_helper(bsTree, key_construct("henlo", 4), 14, 1);
print_node(bsTree->tree_nodes[1]);
return 0;
data.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "data.h"
// Input: ’in_name’: a string ends with ’’
// ’in_id’: an integer
// Output: a pointer of type pointer to Key,
// pointing to an allocated memory containing a Key
// Effect: dynamically allocate memory to hold a Key
// set Key’s id to be in_id
// dynamically allocate memory for the Key’s name
// so that name will contain what is in ’in_name’.
// Note: may use strdup()
Key *key_construct(char *in_name, int in_id)
Key *key = (Key*) malloc(sizeof(Key));
key->name = strdup(in_name);
key->id = in_id;
return key;
// Input: ’key1’ and ’key2’ are two Keys
// Output: if return value < 0, then key1 < key2,
// if return value = 0, then key1 = key2,
// if return value > 0, then key1 > key2,
// Note: use strcmp() to compare key1.name and key2.name
// if key1.name = key2.name, then compare key1.id with key2.id
int key_comp(Key key1, Key key2)
// Input: ’key’: a pointer to Key
// Effect: ( key->name key->id ) is printed
void print_key(Key *key)
char *name = key->name;
int id = key->id;
printf("%s, %i", name, id);
// Input: ’node’: a node
// Effect: node.key is printed and then the node.data is printed
void print_node(Node node)
printf("%s, %d n", node.key->name, node.data);
The issue is that when I run the print_node function in main in bst.c, I expect it to print the key.name and data for indices 1,2,3, and 7 in the array properly. However, the key.name for indices 1 and 3 are not printed properly. Instead, I get a bunch of gibberish that looks something like this - 0+@]�, 11
if I used print_node(bsTree->tree_nodes[1])
. I have a feeling it has something to do with me incorrectly allocating memory for the keys in data.c but I cannot figure out exactly what I'm doing wrong.
c
c
asked Nov 15 '18 at 13:10
PotatoManPotatoMan
365
365
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I believe the error is here:
(size+1 * sizeof(Node))
inside BStree bstree_ini(int size)
:
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
*
is executed first, then +
(like in normal math), see operator precedence, the expression:
size+1 * sizeof(Node)
is equal to:
size + (1 * sizeof(Node))
which is not what you wanted!
Use proper braces:
malloc((size + 1) * sizeof(Node));
or use calloc
:
calloc(sizeof(Node), size + 1);
Some friendly notices:
- Nice code!
- Please don't cast the result of malloc.
bstree->is_free
would be clearer if it would bebool
type. And it would be clearer (to me) if it would bebstree->is_used
as I can expect it is initialized to zero on a new object, it would be also easy to clear itmemset(bstree->is_used, 0, ...)
. You just assign'1'
and'0'
to it, I find boolean to be clearer for this indent,bstree->us_used[obj_num] = true;
In the future you may go for a bit-container.
2
These are all really valuable tips, thank you!
– PotatoMan
Nov 15 '18 at 13:27
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53320247%2fstrange-symbols-being-printed-in-string-c%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I believe the error is here:
(size+1 * sizeof(Node))
inside BStree bstree_ini(int size)
:
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
*
is executed first, then +
(like in normal math), see operator precedence, the expression:
size+1 * sizeof(Node)
is equal to:
size + (1 * sizeof(Node))
which is not what you wanted!
Use proper braces:
malloc((size + 1) * sizeof(Node));
or use calloc
:
calloc(sizeof(Node), size + 1);
Some friendly notices:
- Nice code!
- Please don't cast the result of malloc.
bstree->is_free
would be clearer if it would bebool
type. And it would be clearer (to me) if it would bebstree->is_used
as I can expect it is initialized to zero on a new object, it would be also easy to clear itmemset(bstree->is_used, 0, ...)
. You just assign'1'
and'0'
to it, I find boolean to be clearer for this indent,bstree->us_used[obj_num] = true;
In the future you may go for a bit-container.
2
These are all really valuable tips, thank you!
– PotatoMan
Nov 15 '18 at 13:27
add a comment |
I believe the error is here:
(size+1 * sizeof(Node))
inside BStree bstree_ini(int size)
:
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
*
is executed first, then +
(like in normal math), see operator precedence, the expression:
size+1 * sizeof(Node)
is equal to:
size + (1 * sizeof(Node))
which is not what you wanted!
Use proper braces:
malloc((size + 1) * sizeof(Node));
or use calloc
:
calloc(sizeof(Node), size + 1);
Some friendly notices:
- Nice code!
- Please don't cast the result of malloc.
bstree->is_free
would be clearer if it would bebool
type. And it would be clearer (to me) if it would bebstree->is_used
as I can expect it is initialized to zero on a new object, it would be also easy to clear itmemset(bstree->is_used, 0, ...)
. You just assign'1'
and'0'
to it, I find boolean to be clearer for this indent,bstree->us_used[obj_num] = true;
In the future you may go for a bit-container.
2
These are all really valuable tips, thank you!
– PotatoMan
Nov 15 '18 at 13:27
add a comment |
I believe the error is here:
(size+1 * sizeof(Node))
inside BStree bstree_ini(int size)
:
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
*
is executed first, then +
(like in normal math), see operator precedence, the expression:
size+1 * sizeof(Node)
is equal to:
size + (1 * sizeof(Node))
which is not what you wanted!
Use proper braces:
malloc((size + 1) * sizeof(Node));
or use calloc
:
calloc(sizeof(Node), size + 1);
Some friendly notices:
- Nice code!
- Please don't cast the result of malloc.
bstree->is_free
would be clearer if it would bebool
type. And it would be clearer (to me) if it would bebstree->is_used
as I can expect it is initialized to zero on a new object, it would be also easy to clear itmemset(bstree->is_used, 0, ...)
. You just assign'1'
and'0'
to it, I find boolean to be clearer for this indent,bstree->us_used[obj_num] = true;
In the future you may go for a bit-container.
I believe the error is here:
(size+1 * sizeof(Node))
inside BStree bstree_ini(int size)
:
bstree->tree_nodes = (Node*) malloc(size+1 * sizeof(Node));
bstree->is_free = (unsigned char *) malloc (size+1 * sizeof(unsigned char));
memset (bstree->is_free, '1', size+1);
*
is executed first, then +
(like in normal math), see operator precedence, the expression:
size+1 * sizeof(Node)
is equal to:
size + (1 * sizeof(Node))
which is not what you wanted!
Use proper braces:
malloc((size + 1) * sizeof(Node));
or use calloc
:
calloc(sizeof(Node), size + 1);
Some friendly notices:
- Nice code!
- Please don't cast the result of malloc.
bstree->is_free
would be clearer if it would bebool
type. And it would be clearer (to me) if it would bebstree->is_used
as I can expect it is initialized to zero on a new object, it would be also easy to clear itmemset(bstree->is_used, 0, ...)
. You just assign'1'
and'0'
to it, I find boolean to be clearer for this indent,bstree->us_used[obj_num] = true;
In the future you may go for a bit-container.
edited Nov 15 '18 at 13:24
answered Nov 15 '18 at 13:18
Kamil CukKamil Cuk
13.9k2531
13.9k2531
2
These are all really valuable tips, thank you!
– PotatoMan
Nov 15 '18 at 13:27
add a comment |
2
These are all really valuable tips, thank you!
– PotatoMan
Nov 15 '18 at 13:27
2
2
These are all really valuable tips, thank you!
– PotatoMan
Nov 15 '18 at 13:27
These are all really valuable tips, thank you!
– PotatoMan
Nov 15 '18 at 13:27
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53320247%2fstrange-symbols-being-printed-in-string-c%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown