Вы должны выделить память для вашего struct
, прежде чем пытаться его использовать, используя malloc()
:
struct xx *p = NULL;
p = malloc(sizeof(struct xx));
if (!p) {
fprintf(stderr, "could not allocate memory for pointer p\n");
exit(-1);
}
p->a = 77;
...
free(p); /* do this when you no longer need pointer p */
Что касается доступа к x
, этоЛучше всего скопировать строку, например, :
#include <string.h>
...
if (strncpy(p->x, "blahblah", 4))
fprintf(stdout, "p->x: %s\n", p->x); /* p->x: blah */
else {
fprintf(stderr, "could not copy string to p->x\n");
exit(-1);
}
Попробуйте использовать strncpy()
, где вы можете, так как ручное указание количества символов может помочь реализовать привычкупроверки границ, помогая избежать переполнения.
Например, давайте попробуем скопировать const char *
в p->x
, который оказывается длиннее того, что может содержать p->x
:
#include <assert.h>
#define MAX_LENGTH 10
struct xx {
int a;
char x[MAX_LENGTH];
};
...
const char *foo = "blahblahblah";
assert(strlen(foo) < MAX_LENGTH); /* code should fail here */
if (strncpy(p->x, foo, strlen(foo) + 1))
...
Когда вы запустите это,assert()
следует отключить:
Assertion failed: (strlen(foo) < MAX_LENGTH), function main, file test.c, line xyz.
Abort trap: 6
Как только foo
сокращается до девяти или менее символов (вам нужен этот десятый символ для \0
терминатора, помните!) Код должен работать правильно.*
Так что используйте strncpy()
и проверьте свои границы!