C 和 strcpy 中的字符串指针数组

String pointer array in C and strcpy

#define null "null" //its declared on top

int hash_size=100;
char *hash_table[hash_size];

int i;

for(i=0;i<hash_size;i++){
    strcpy(hash_table[i],null);// it doesn't works. WHY!
    //hash_table[i]=null; it works
}

我创建了一个字符串指针数组。我想用 "null" 分配所有元素。但是 strcpy 函数不起作用。为什么?

hash_table 是一个指针数组,但您尚未将它们初始化为指向任何地方。您尚未初始化指针数组中的指针。

你可以说

hash_table[i] = null;

这会奏效。

您可以按照以下方式进行

#define null "null" //its declared on top

int hash_size=100;
char *hash_table[hash_size];

int i;

char *p = null;

for(i=0;i<hash_size;i++){
    hash_table[i] = p;
}

在这种情况下,hash_table 的所有元素将指向相同的字符串文字 "null"

您不能复制字符串文字,因为 1) 数组的元素未初始化,并且 2) 没有指向足够大的内存范围来存储字符串文字的副本。

您只创建了一个数组指针。但是这些指针不指向任何有效的内存——它们是未初始化的。这是undefined behaviour

null也没什么意义。如果你想将指针初始化为 NULL 指针,那么你可以简单地做:

char *hash_table[hash_size] = {0}; 

或者如果你真的希望每个指针都指向字符串文字 "null" 那么你可以分配它:

for(i=0;i<hash_size;i++){
    hash_table[i]=null;
}

赋值有效,因为数组中的每个指针都简单地指向字符串文字并指向 相同的 字符串文字。

如果你想修改指针指向的内存那么你需要分配内存:

for(i=0;i<hash_size;i++){
    hash_table[i] = malloc(sizeof("null"));
    if (hash_table[i]) { 
       */ error */
    }
    strcpy(hash_table[i],null);
}

free() 完成后类似循环中的指针。