Arrays 动态分配字符串数组

Arrays 动态分配字符串数组,arrays,c,string,dynamic-memory-allocation,Arrays,C,String,Dynamic Memory Allocation,如何修复此代码,使其打印数组中的单词?此外,这是为最大大小为40的n个字动态分配内存的正确方法 int main() { int n; char *arr; int i; printf("Give me a number:"); scanf("%d", &n); arr = malloc(n * 40); for (i = 0; i < n; i++) {

如何修复此代码,使其打印数组中的单词?此外,这是为最大大小为40的n个字动态分配内存的正确方法

int main() {

    int n;
    char *arr;
    int i;

    printf("Give me a number:");
    scanf("%d", &n);

    arr = malloc(n * 40);

    for (i = 0; i < n; i++)
    {
        printf("Give me a word: ");
        scanf("%s", &arr[i]);
    }

    for (i = 0; i < n; i++)
    {
        printf("%s", arr[i]); //< --problem here
    }

    return 0;
}
这:

fori=0;我这个:


fori=0;i您的分配不是最好的,printf参数arr[i]需要一个字符*,但如果您愿意,您可以将int传递给它

以下是您应该如何操作,并附有注释:

您还可以使用指向40个字符的数组的指针,用更少的代码完成此操作,这将简化内存分配和释放:

带注释的示例:


您的分配不是最好的,printf参数arr[i]需要一个char*,但如果愿意,您可以将int传递给它

以下是您应该如何操作,并附有注释:

您还可以使用指向40个字符的数组的指针,用更少的代码完成此操作,这将简化内存分配和释放:

带注释的示例:


不,字符和字符串不一样。请尝试例如typedef char BUF[40];然后BUF*arr=mallocn*sizeofBUF;。不,字符和字符串不一样。请尝试例如typedef char BUF[40];然后BUF*arr=mallocn*sizeofBUF;。在他的代码中&arr[i]是一个char*,因为arr是char*,所以arr[i]应该是char,并添加一个符号,使指针指向一个值。挑剔:因为每个字符串的分配是40个字符,所以我更喜欢更简单的分配:char*a[40];a=mallocn*sizeof*a;那么malloc和free都是一行。@cajomar,是的,你是对的,我对角读了它,没有注意到。谢谢你,但为什么我也可以按@4386427所说的那样分配呢?通过这种方式,分配不仅仅针对一个字符串?我更了解第一个代码,你能更好地解释一下第二个代码如何为所有n个单词分配内存,而不是像我想的那样只为一个单词分配内存吗?我怎么读这个:char*arr[40]?char*arr[40]有什么不同?@Boninssimo,它有点像crypric,但它是+-很容易理解的,arr是一个指向40个字符数组的指针,比如sizeof*arr,解引用指针的大小是40字节,这个乘以n会给你所需的内存块,现在arr是指向40个字符的指针,增加它将指向下一个40个字符的块。例如,如果n为2,则有一个40*2字节的块,arr[0]指向块的开头第一个字节,如果可以,则arr[1]跳转40个字节并指向第二行字节41。这是以线性方式存储在内存中的。在他的代码&arr[i]是char*,因为arr是char*,所以arr[i]将是char,并添加一个符号,使指针指向一个值。吹毛求疵:因为每个字符串分配40个字符,我更喜欢更简单的分配:char*a[40];a=mallocn*sizeof*a;那么malloc和free都是一行。@cajomar,是的,你是对的,我对角读了它,没有注意到。谢谢你,但为什么我也可以按@4386427所说的那样分配呢?通过这种方式,分配不仅仅针对一个字符串?我更了解第一个代码,你能更好地解释一下第二个代码如何为所有n个单词分配内存,而不是像我想的那样只为一个单词分配内存吗?我怎么读这个:char*arr[40]?char*arr[40]有什么不同?@Boninssimo,它有点像crypric,但它是+-很容易理解的,arr是一个指向40个字符数组的指针,比如sizeof*arr,解引用指针的大小是40字节,这个乘以n会给你所需的内存块,现在arr是指向40个字符的指针,增加它将指向下一个40个字符的块。例如,如果n为2,则有一个40*2字节的块,arr[0]指向块的开头第一个字节,如果可以,则arr[1]跳转40个字节并指向第二行字节41。这是以线性方式存储在内存中的。
for(i=0; i<n; i++){
    printf("%s", arr + i*40);
}
for(i=0; i<n; i++){
    printf("Give me a word: ");
    scanf("%s", &arr[i]);
}
#include <stdio.h>
#include <stdlib.h> //for malloc

int main(){
    int n;
    int i;
    
    printf("Give me a number:");
    scanf("%d", &n);

    //declare a variable of pointer to pointer to char
    //allocate memory for the array of pointers to char, 
    //each one capable of pointing to a char array
    char **arr = malloc(n * sizeof *arr);

    if(arr == NULL){ //check for allocation errors
        perror("malloc");
        return EXIT_FAILURE;
    }

    //allocate memory for each individual char array
    for(i = 0; i < n; i++){
        arr[i] = malloc(40); //char size is always 1 byte

        if(arr == NULL){ //check for allocation errors
            perror("malloc");
            return EXIT_FAILURE;
        }
    }

    for (i = 0; i < n; i++){
        printf("Give me a word: ");
        //limit the size of read input to 39 charaters to avoid overflow, 
        //a nul character will be added by scanf
        scanf("%39s", arr[i]);
    }

    for (i = 0; i < n; i++){
        printf("%s\n", arr[i]);
       
    }
     
    for(int i = 0; i < n; i++){ //free the memory for each char array
        free(arr[i]);
    }
    free(arr); //free array of pointers

    return 0;
}
#include <stdio.h>
#include <stdlib.h> //for malloc

int main(){
    int n;    
    int i;

    printf("Give me a number:");
    scanf("%d", &n);

    //declare a pointer to array of chars and
    //allocate memory for all the char arrays
    char (*arr)[40] = malloc(n * sizeof *arr);

    if(arr == NULL){ //check for allocation errors
        perror("malloc");
        return EXIT_FAILURE;
    }

    for (i = 0; i < n; i++){
        printf("Give me a word: ");
        scanf("%39s", arr[i]);
    }

    for (i = 0; i < n; i++){
        printf("%s\n", arr[i]);
    }

    free(arr); //free allocated memory

    return 0;
}