Arrays 动态分配字符串数组
如何修复此代码,使其打印数组中的单词?此外,这是为最大大小为40的n个字动态分配内存的正确方法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++) {
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;
}