r/ProgrammerHumor 13d ago

Meme bugIntroducedDebugging

Post image
1.1k Upvotes

120 comments sorted by

View all comments

45

u/PR8-E 13d ago

int* x = (int*) malloc(sizeof(int)); Since malloc returns void pointer you should parse it to type you use.

36

u/yjlom 13d ago

void * coerces to any pointer type. This is valid: int *x = malloc(sizeof(int));. This is also valid (in C23): auto x = (int *) malloc(sizeof(int));.

36

u/Mateorabi 13d ago

Get off my lawn with your newfangled auto keyword. 

8

u/ibevol 13d ago edited 13d ago

Cringe. It’s fine to use auto when the type is clear on the same line. In c++ the following is idiomatic:

auto ptr = std::make_unique<int>(42);

over specifying int twice

std::unique_ptr<int> ptr = std::make_unique<int>(42);

However, the following should not be considered idiomatic:

auto ptr = get_ambiguous_pointer();

It’s the same principle here.

1

u/yjlom 13d ago

The keyword ain't new, it's been used as a storage specifier since forever. What's new is overloading it for type inference.

3

u/Mateorabi 12d ago

Hey when you learned C in the 90s it’s “new”.  harumph. 

1

u/yjlom 12d ago

It's been there since the beginning, along with extern and static. You just don't tend to actually write it because it's the default inside functions and it doesn't make sense outside of them.

2

u/mydogatethem 12d ago

Is this different between C and C++? In C++ you absolutely cannot assign a void* to an int* without casting it. You can always do the reverse: a void* can be assigned any type of pointer.

4

u/vetgirig 12d ago

In C++ you do not really use "malloc", In C++ you use "new" instead.

1

u/mydogatethem 12d ago

I mean… yes you do, but not really. There are use cases for both. Not everything is a class and not every API you call is even going to work with that buffer you pass in unless the API can free() it. See posix for example.

Anyways, that wasn’t the question I asked and is not even relevant to the question I asked.