An overview of struct in C. Source code: github.com/portfoliocourses/c.... Check out www.portfoliocourses.com to build a portfolio that will impress employers!
Also note in this video when we assign y to x, this would *also* be a memory leak, which is bad! 🙂 I was trying to stay focused on structs in this video, but this other video covers memory leaks which are important to avoid: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-lQCLAKfcYI4.html.
Very clear explanation about how pointers contain a reference to some area in memory and not the content of that memory area itself and why you need to be extra careful when reasigning pointers. Thank you so much for your work!
Omg thank you so much, this is so much better than two two hours lectures i had on structs... I have an exam next week and gonna watch the other videos on pointers and strings if you have any❤❤❤
Thank you, You did very good explanation with exampels. You finally made me learn to use structs properly and to pass them correctly to different functions.
@@PortfolioCourses hi sir I am having a doubt why we used strcpy to assign string to structure members of " name and ID " Instead OF ASSIGNING directly like normal structure variable of age and grades . I have tried to assign string to structure members of "name and ID " when I compiled my code I got an error . why and what is the difference can you pls explain me ???😊
@@ramakrishna4092 We can initialize the string when we declare the struct using an initializer list as in this example: www.delftstack.com/howto/c/c-initialize-struct/. But if we first declare the struct, and then set the members with individual assignment statements, we cannot later use = to assign to the string. It's like how in C we can initialize an array once with the {1,2,3,4,...} type syntax, when it is declared, but not afterwards. When we make a char array we can initialize it once to a string literal when it is declared: char string[] = "store this string"; But if we had this it would not work: char string[20]; string = "store this string"; The same thing is happening here essentially, when we declare the struct the string is essentially declared and created similar to the above example. We cannot assign to it later with = "some string", we then need to use strcpy(). It's just how C works that it's like this really. 🙂
My teacher is totally useless. This channel is the only thing, keeping me from failing. Thank you so much, you have a knack for explaining hard material so a noob can understand it.
@@PortfolioCourses always helping mate. thank you so much! i have an assignment now with an array of struct to represent items in a shop (name, price, amount). they asked us to make a program with different functions so the user can add a product and buy a product from that shop and so the array has to be synchronized between all functions. I don't know how to make it happen because we didn't learn pointers yet.
@@Jonathan-mu5nx I have some videos on pointers and structs you might like: Introduction To Pointers: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-2GDiXG5RfNE.html Arrow Operator: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-w5XM1N7hLgc.html Dynamically allocate an array of structs: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-lq8tJS3g6tY.html Good luck! 🙂
@4:00 Hi Kevin, I have watched this before and would love to learn how to copy this struct from an Excel Spread Sheet, and Paste it and Save it to Excel Spread Sheet. I appreciate if you have the time to do a video on that. This makes a very useful tool for embedded design. Thanks a million, Kevin.
I wanted to ask something about the data struct and when you declared x = y. That struct only has a pointer variable so when you did x = y you are assigning the pointer value of y to x right? That's why when modifying x.array[0] if you print both x.array[0] and y.array[0] they have the same value, so in that example as we assigned the x pointer variable to be the same as y we lost the pointer to the original array that x was pointing to right? It still exists in memory but we can't used it?
Love your videos! Learned more in two weeks than 5 months of studying. I have one question tho: When calling the function (at around 9:10 in the video) I get the error: a parameter list without types is only allowed in a function definition; when I try to compile it. (the error for the function call in the main body)
Great channel with great explanations, thank you! I just fiddled around with memory and leaks. I hope this is correct and may help someone. #include #include typedef struct { int *array; } Data; void print_array(const char *name, Data data) { printf("Array %s ", name); for (int i = 0; i < 2; i++) { printf("%i: %d ", i, data.array[i]); } printf(" "); } void separate_data() { Data x; x.array = (int *) malloc(sizeof(int) * 2); x.array[0] = 1; x.array[1] = 8; print_array("x", x); Data y; y.array = (int *) malloc(sizeof(int) * 2); y.array[0] = 9; y.array[1] = 9; print_array("y", y); free(x.array); free(y.array); } void same_data() { Data x; x.array = (int *) malloc(sizeof(int) * 2); x.array[0] = 1; x.array[1] = 8; print_array("x", x); Data y; y.array = (int *) malloc(sizeof(int) * 2); y.array[0] = 9; y.array[1] = 9; print_array("y", y); // deallocate memory of x because pointer x will be moved to y free(x.array); x = y; print_array("x=y", x); free(y.array); } int main() { separate_data(); same_data(); }
I have seen alot of your videos and are helpful, I have a little problem how would I get computer serial Number. system("wmic get bios serialnumber>sn.txt"); And store it in an array of character and then print it on screen.? I really need help with that.
23:00 In case it was not mentioned, you also get a memory leak on the x.array block, and a duplicate reference to the y.array block... Common pitfalls to the begginers...
I have a question. In the assignment of structures, does the addresses of the structures also gets copied? E.g., When we do p1 = p2, does p1 also contains the address of p2?
Great question! :-) No, p1 and p2 each have their own address at which a struct is stored. And when we do p1 = p2, a memcpy() will effectively happen where p2's contents are copied to p1. But p1 and p2 each still are in different memory addresses.
quick question, what happens to the previous malloc'ed memory region of x after pointing it to y? does it just float in memory to be reclaimed by the OS later?
It's a memory leak. :-) Which means the memory has been allocated, but is no longer accessible by our program. It also won't be "returned" to the OS until the program terminates. So we call it a memory leak because the memory is no longer available for our program, but it's also not being used in a useful way either.
Great video. I have a question. What's the difference between a struct and class? And when to use them. I know class is by default private but how to use these two terms properly.
I don’t think C has classes that’s C++ but I’m also confused on like why classes were a necessary change from C to C++ I’m pretty sure it has something to do with OOP but I’m not too sure
Just looked it up I guess classes have a deinitializer function that destroys instances of the class so I guess you can’t tell if the structs are getting destroyed
I'm learning C, i'm an amateur wannabe from python, can i take the structs as objects, and the variables declared from the structs as instances?, I feel them like that
Great question Jay! :-) And yes that’s correct, when we define a type of struct it’s a lot like defining a class in Python (in other words, a type of object). And when we declare variables of that struct type, those are a lot like object instances.
difference between structs and class is that in structs, functions are private and data members are public, while in class, it's opposite. However, C does not have any concept of objects, as we don't instantiate. In C, structures are mainly used for the purpose of grouping various information under one name.
i actually found a solution: we need to free x.array before we make x=y assign, then at the very end we free y.array. I was trying to free both x and y array at the very end but there was still a leak, so hope it might help someone check for leaks on Mac with: CK_FORK=no leaks --atExit -- ./a.out
#include #include #include typedef struct { int *array; // pointer to dynamically allocated array } Data; int main() { // initialise two structures named x and y of type Data Data x; Data y; // stores 5 int in dynamically allocated array x.array = malloc(sizeof(int) * 5); y.array = malloc(sizeof(int) * 5); printf(" X's pointer: %p ", x.array); printf("Y's pointer: %p ", y.array); x.array[0] = 1; x.array[1] = 2; x.array[2] = 3; x.array[3] = 4; x.array[4] = 5; printf(" ////// x.array /////////// "); for(int i = 0; i < 5; i++) { printf("x.array[%d] = %d ", i, x.array[i]); } y.array[0] = 9; y.array[1] = 9; y.array[2] = 9; y.array[3] = 9; y.array[4] = 9; // 'x' with it's pointer to the array it has been set to point to the same array that 'y' is pointing to // so they point to the same array, // cuz the STRUCTURE STORES A POINTER TO THE ARRAY THAT WE DYNAMICALLY ALLOCATE free(x.array); // free up the allocation before we assign x = y; // here we see that they both now point to the same pointer for an array printf(" X's pointer: %p ", x.array); printf("Y's pointer: %p ", y.array); printf(" ////// x.array after assign to y /////////// "); for(int i = 0; i < 5; i++) { printf("x.array[%d] = %d ", i, x.array[i]); } printf(" "); // if we change one value of x array, those changes apply also to the y, cuz after x=y assign they both point to the same array x.array[0] = 10; printf(" ////// y.array after x.array[0] was changed /////////// "); for(int i = 0; i < 5; i++) { printf(" y.array[%d] = %d ", i, y.array[i]); } printf(" "); free(y.array); return 0; }
In C, essentially yes. :-) In C++ struct is a lot more like class though, just so you know: learn.microsoft.com/en-us/cpp/cpp/classes-and-structs-cpp?view=msvc-170
I absolutely love these videos, but I think it's important to point out that when you use malloc, you have to free the space before reassigning the pointer, or a memory leak is created. And I only say this because the dementia patients in the Whitehouse just urged us all to stop using these languages for this reason.
You're right, I was trying to stay focused on structs in this video and keeping it to a reasonable time, I've made note of this and pinned a link to this other video on memory leaks now: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-lQCLAKfcYI4.html
You teach very good undoubtedly but if you could give separate examples of every items instead of massing everything in a single code, it would be better to understand for us.... You can copy and paste from the previous code that you needed for the next example but please give separate examples instead of giving a very long example.