#include<stdio.h>
#include<string.h>
static char* abc = "kj";
// What exactly does this function do?
void fn(char**s) {
printf("arg deref before: %p\n", *s
);
// This throws. *s is not a valid address.
// printf("contents: ->%s<-\n", *s);
*s = abc;
printf("arg deref after assigning abc: %p\n", *s
);
// Now *s holds a valid address (that of "kj").
printf("contents: ->%s<-\n", *s
);
}
// Helper function to print a char pointer and the first bytes
// it points to
void printStr(const char *const caption, const char *const ptr)
{
int i=0;
printf("%s: ->%s<-, i.e. {", caption
, ptr
); for( i=0; i<sizeof(char *)-1; ++i)
{
}
printf( "0x%x ...}\n", ptr
[sizeof(char *)-1] ); }
int main() {
char str[256];
printf("size of ptr: %zu\n", sizeof(void *)); strcpy(str
, "AAAAAAAA"); // 9 defined bytes printStr("str", str);
printf("arr addr: %p\n", &str
); printf("addr of abc: %p\n", abc
);
fn(&str);
printStr("str after fn (a pointer value, only accidentally printable): ", str);
printf("arr addr after fn: %p\n", &str
);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RyaW5nLmg+CnN0YXRpYyBjaGFyKiBhYmMgPSAia2oiOwoKLy8gV2hhdCBleGFjdGx5IGRvZXMgdGhpcyBmdW5jdGlvbiBkbz8Kdm9pZCBmbihjaGFyKipzKSB7CglwcmludGYoImFyZzogJXBcbiIsIHMpOwoJcHJpbnRmKCJhcmcgZGVyZWYgYmVmb3JlOiAlcFxuIiwgKnMpOwoJCgkvLyBUaGlzIHRocm93cy4gKnMgaXMgbm90IGEgdmFsaWQgYWRkcmVzcy4KCS8vIHByaW50ZigiY29udGVudHM6IC0+JXM8LVxuIiwgKnMpOwoJCgkqcyA9IGFiYzsKCXByaW50ZigiYXJnIGRlcmVmIGFmdGVyIGFzc2lnbmluZyBhYmM6ICVwXG4iLCAqcyk7CgkKCS8vIE5vdyAqcyBob2xkcyBhIHZhbGlkIGFkZHJlc3MgKHRoYXQgb2YgImtqIikuCglwcmludGYoImNvbnRlbnRzOiAtPiVzPC1cbiIsICpzKTsKCQp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gcHJpbnQgYSBjaGFyIHBvaW50ZXIgYW5kIHRoZSBmaXJzdCBieXRlcwovLyBpdCBwb2ludHMgdG8Kdm9pZCBwcmludFN0cihjb25zdCBjaGFyICpjb25zdCBjYXB0aW9uLCBjb25zdCBjaGFyICpjb25zdCBwdHIpCnsKCWludCBpPTA7CglwcmludGYoIiVzOiAtPiVzPC0sIGkuZS4geyIsIGNhcHRpb24sIHB0cik7Cglmb3IoIGk9MDsgaTxzaXplb2YoY2hhciAqKS0xOyArK2kpCgl7CgkgICAgcHJpbnRmKCIweCV4LCIsIHB0cltpXSk7Cgl9CglwcmludGYoICIweCV4IC4uLn1cbiIsIHB0cltzaXplb2YoY2hhciAqKS0xXSApOwp9CgppbnQgbWFpbigpIHsKICAgY2hhciBzdHJbMjU2XTsKICAgCiAgIHByaW50Zigic2l6ZSBvZiBwdHI6ICV6dVxuIiwgc2l6ZW9mKHZvaWQgKikpOwogICBzdHJjcHkoc3RyLCAiQUFBQUFBQUEiKTsgLy8gOSBkZWZpbmVkIGJ5dGVzCiAgIHByaW50U3RyKCJzdHIiLCBzdHIpOwogICBwcmludGYoImFyciBhZGRyOiAlcFxuIiwgJnN0cik7CiAgIHByaW50ZigiYWRkciBvZiBhYmM6ICVwXG4iLCBhYmMpOwogICAKICAgZm4oJnN0cik7CiAgIAogICAKICAgcHJpbnRTdHIoInN0ciBhZnRlciBmbiAoYSBwb2ludGVyIHZhbHVlLCBvbmx5IGFjY2lkZW50YWxseSBwcmludGFibGUpOiAiLCBzdHIpOwogICBwcmludGYoImFyciBhZGRyIGFmdGVyIGZuOiAlcFxuIiwgJnN0cik7CiAgIAogICByZXR1cm4gMDsKfQ==
size of ptr: 4
str: ->AAAAAAAA<-, i.e. {0x41,0x41,0x41,0x41 ...}
arr addr: 0xbfa9bc40
addr of abc: 0x804868f
arg: 0xbfa9bc40
arg deref before: 0x41414141
arg deref after assigning abc: 0x804868f
contents: ->kj<-
str after fn (a pointer value, only accidentally printable): : ->��AAAA<-, i.e. {0xffffff8f,0xffffff86,0x4,0x8 ...}
arr addr after fn: 0xbfa9bc40