Pointerni qaytarib berishi kerak, ammo yaxshi ishlaydi

typedef struct person {
    int id;
    char* name;
} Person;

//constructor like function
Person* New_Person(int id,char *name){
    Person* p = malloc(sizeof(Person));
    p->id = id;
    p->name = name;
    //return p; 
}

int main(){
    for(int i=0;i<10;i++){
        Person* p = New_Person(i,"abcd");
        printf("id:%d name:%s \n",p->id,p->name);
    }
    printf("DONE\n");
    return 0;
}

New_Person is like a constructor and its supposed to return a pointer to the newly allocated person, if i comment the return statement in the New_Person function i still get the same behavior, can someone please explain to me why it compiles and gives the same behavior without a return statement?

2
@Gopi, albatta, buni qabul qilmayman, men tasodifiy qaytish bayonotini unutganman va hali ham ishladim
qo'shib qo'ydi muallif FPGA, manba
@Gopi, albatta, buni qabul qilmayman, men tasodifiy qaytish bayonotini unutganman va hali ham ishladim
qo'shib qo'ydi muallif FPGA, manba
@Gopi, albatta, buni qabul qilmayman, men tasodifiy qaytish bayonotini unutganman va hali ham ishladim
qo'shib qo'ydi muallif FPGA, manba
@mafso uchun minnatdorman -Wall endi men ogohlantirish olaman
qo'shib qo'ydi muallif FPGA, manba
@mafso uchun minnatdorman -Wall endi men ogohlantirish olaman
qo'shib qo'ydi muallif FPGA, manba
@mafso uchun minnatdorman -Wall endi men ogohlantirish olaman
qo'shib qo'ydi muallif FPGA, manba
"Belgilangan harakatlar" ni qidiring. Bu degani, biror narsa yuz berishi mumkin va kompilyator sizga aytishga hojat yo'q. Qaytilmaydigan funksiyaning qaytib kelish qiymati yordamida aniqlanmagan. Tegishli ogohlantirish parametrlaridan foydalanish ba'zi hollarda (masalan, gcc bilan ishlaydi) ( -Wall ).
qo'shib qo'ydi muallif mafso, manba
"Belgilangan harakatlar" ni qidiring. Bu degani, biror narsa yuz berishi mumkin va kompilyator sizga aytishga hojat yo'q. Qaytilmaydigan funksiyaning qaytib kelish qiymati yordamida aniqlanmagan. Tegishli ogohlantirish parametrlaridan foydalanish ba'zi hollarda (masalan, gcc bilan ishlaydi) ( -Wall ).
qo'shib qo'ydi muallif mafso, manba
"Belgilangan harakatlar" ni qidiring. Bu degani, biror narsa yuz berishi mumkin va kompilyator sizga aytishga hojat yo'q. Qaytilmaydigan funksiyaning qaytib kelish qiymati yordamida aniqlanmagan. Tegishli ogohlantirish parametrlaridan foydalanish ba'zi hollarda (masalan, gcc bilan ishlaydi) ( -Wall ).
qo'shib qo'ydi muallif mafso, manba
Kodingizdagi noma'lum xatti-harakatlariga erishish orqali kutilgan natijani qo'lga kiritganingizdan shunchaki egasidirsiz. Men derazaning sizdan funksiyadan qaytmasligingiz haqida ogohlantirmasligini bilmayman.
qo'shib qo'ydi muallif Gopi, manba
Kodingizdagi noma'lum xatti-harakatlariga erishish orqali kutilgan natijani qo'lga kiritganingizdan shunchaki egasidirsiz. Men derazaning sizdan funksiyadan qaytmasligingiz haqida ogohlantirmasligini bilmayman.
qo'shib qo'ydi muallif Gopi, manba
qo'shib qo'ydi muallif Anto Jurković, manba
qo'shib qo'ydi muallif Anto Jurković, manba
qo'shib qo'ydi muallif Anto Jurković, manba

6 javoblar

Sizda nima bor?

main() ichidagi p ko'rsatgichi New_person() funksiyasidan qaytmasdan ishga tushirilmaydi. Shunday qilib, uninitialized o'zgarmaydigan ishlatib, undefined behaviors.

Siz uyingizda biroz xotira ajratasiz va malloc() tomonidan yuborilgan manzil main() ichida p pointeriga hech qachon ma'lum emas. Shunday qilib, siz tasodifiy xotiraga kirasiz va sizning omadingiz uchun tasodifiy xotira sizning uyingizda joylashtirilgan narsadir.

4
qo'shib qo'ydi

Sizda nima bor?

main() ichidagi p ko'rsatgichi New_person() funksiyasidan qaytmasdan ishga tushirilmaydi. Shunday qilib, uninitialized o'zgarmaydigan ishlatib, undefined behaviors.

Siz uyingizda biroz xotira ajratasiz va malloc() tomonidan yuborilgan manzil main() ichida p pointeriga hech qachon ma'lum emas. Shunday qilib, siz tasodifiy xotiraga kirasiz va sizning omadingiz uchun tasodifiy xotira sizning uyingizda joylashtirilgan narsadir.

4
qo'shib qo'ydi

Sizda nima bor?

main() ichidagi p ko'rsatgichi New_person() funksiyasidan qaytmasdan ishga tushirilmaydi. Shunday qilib, uninitialized o'zgarmaydigan ishlatib, undefined behaviors.

Siz uyingizda biroz xotira ajratasiz va malloc() tomonidan yuborilgan manzil main() ichida p pointeriga hech qachon ma'lum emas. Shunday qilib, siz tasodifiy xotiraga kirasiz va sizning omadingiz uchun tasodifiy xotira sizning uyingizda joylashtirilgan narsadir.

4
qo'shib qo'ydi

Men ham xuddi shunday yo'l tutdim, shuning uchun men konstruktorni demontaj qildim:

0000000000000000 :
 0: 55                      push   %rbp
 1: 48 89 e5                mov    %rsp,%rbp
 4: 48 83 ec 20             sub    $0x20,%rsp
 8: 89 7d ec                mov    %edi,-0x14(%rbp)
 b: 48 89 75 e0             mov    %rsi,-0x20(%rbp)
 f: bf 10 00 00 00          mov    $0x10,%edi
14: e8 00 00 00 00          callq  19 
19: 48 89 45 f8             mov    %rax,-0x8(%rbp)
1d: 48 8b 45 f8             mov    -0x8(%rbp),%rax
21: 8b 55 ec                mov    -0x14(%rbp),%edx
24: 89 10                   mov    %edx,(%rax)
26: 48 8b 45 f8             mov    -0x8(%rbp),%rax
2a: 48 8b 55 e0             mov    -0x20(%rbp),%rdx
2e: 48 89 50 08             mov    %rdx,0x8(%rax)
32: c9                      leaveq 
33: c3                      retq   

Sizning pochingiz, rax jurnalida saqlanadi, bu esa funksiya qaytish qiymatlari saqlanadigan registr bo'lib xizmat qiladi (tamsayı va markerlarning turlari uchun).

1
qo'shib qo'ydi

Men ham xuddi shunday yo'l tutdim, shuning uchun men konstruktorni demontaj qildim:

0000000000000000 :
 0: 55                      push   %rbp
 1: 48 89 e5                mov    %rsp,%rbp
 4: 48 83 ec 20             sub    $0x20,%rsp
 8: 89 7d ec                mov    %edi,-0x14(%rbp)
 b: 48 89 75 e0             mov    %rsi,-0x20(%rbp)
 f: bf 10 00 00 00          mov    $0x10,%edi
14: e8 00 00 00 00          callq  19 
19: 48 89 45 f8             mov    %rax,-0x8(%rbp)
1d: 48 8b 45 f8             mov    -0x8(%rbp),%rax
21: 8b 55 ec                mov    -0x14(%rbp),%edx
24: 89 10                   mov    %edx,(%rax)
26: 48 8b 45 f8             mov    -0x8(%rbp),%rax
2a: 48 8b 55 e0             mov    -0x20(%rbp),%rdx
2e: 48 89 50 08             mov    %rdx,0x8(%rax)
32: c9                      leaveq 
33: c3                      retq   

Sizning pochingiz, rax jurnalida saqlanadi, bu esa funksiya qaytish qiymatlari saqlanadigan registr bo'lib xizmat qiladi (tamsayı va markerlarning turlari uchun).

1
qo'shib qo'ydi

Men ham xuddi shunday yo'l tutdim, shuning uchun men konstruktorni demontaj qildim:

0000000000000000 :
 0: 55                      push   %rbp
 1: 48 89 e5                mov    %rsp,%rbp
 4: 48 83 ec 20             sub    $0x20,%rsp
 8: 89 7d ec                mov    %edi,-0x14(%rbp)
 b: 48 89 75 e0             mov    %rsi,-0x20(%rbp)
 f: bf 10 00 00 00          mov    $0x10,%edi
14: e8 00 00 00 00          callq  19 
19: 48 89 45 f8             mov    %rax,-0x8(%rbp)
1d: 48 8b 45 f8             mov    -0x8(%rbp),%rax
21: 8b 55 ec                mov    -0x14(%rbp),%edx
24: 89 10                   mov    %edx,(%rax)
26: 48 8b 45 f8             mov    -0x8(%rbp),%rax
2a: 48 8b 55 e0             mov    -0x20(%rbp),%rdx
2e: 48 89 50 08             mov    %rdx,0x8(%rax)
32: c9                      leaveq 
33: c3                      retq   

Sizning pochingiz, rax jurnalida saqlanadi, bu esa funksiya qaytish qiymatlari saqlanadigan registr bo'lib xizmat qiladi (tamsayı va markerlarning turlari uchun).

1
qo'shib qo'ydi