函数中全局变量的malloc和realloc
Malloc and realloc of global variable in function
我试图以两种不同的方式通过动态分配从标准输入读取输入:
1) 我从 stdin、malloc、realloc 读取并写入 main 中的数组。然后当我打印数组的那些元素时,一切正常。
2) 我在 main 中声明全局变量,然后将其放入函数中,在该函数中我从 stdin、malloc、realloc 读取并写入该数组。当我在函数中打印这些元素时,它工作正常,但是当我在函数之外这样做时,它给我分段错误。
你能检查这些代码并帮助我解决这个问题吗?
2)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*--------------------------------------------------------------------------*/
void nacitaj( int *pocet_slov, char **slovnik ){
char buffer[60];
int size = 60;
while( fgets( buffer, size, stdin ) != NULL ){
*pocet_slov = *pocet_slov + 1;
slovnik = (char**) realloc( slovnik, (*pocet_slov+1) * sizeof(char*) );
slovnik[*pocet_slov-1] = (char*) malloc( strlen(buffer) * sizeof(char) );
buffer[strlen(buffer)-1] = '[=10=]';
strcpy( slovnik[*pocet_slov-1], buffer );
}
for( int i = 0; i < *pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
}
/*---------------------------------------------------------------------------*/
int main(){
char **slovnik = NULL;
int pocet_slov = 0;
int i;
printf( "Zadavaj slova do slovniku:\n" );
nacitaj( &pocet_slov, slovnik );
for( i = 0; i < pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
return 0;
}
1)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char **slovnik = NULL;
int pocet_slov = 0;
char buffer[60];
int size = 60;
int i;
printf( "Zadavaj slova do slovniku:\n" );
while( fgets( buffer, size, stdin ) != NULL ){
pocet_slov ++;
slovnik = (char**) realloc( slovnik, (pocet_slov+1) * sizeof(char*) );
slovnik[pocet_slov-1] = (char*) malloc( strlen(buffer) * sizeof(char) );
buffer[strlen(buffer)-1] = '[=11=]';
strcpy( slovnik[pocet_slov-1], buffer );
}
for( i = 0; i < pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
return 0;
}
输入示例:
car
bird
pen
在代码 2) 中,您没有声明全局变量。您应该在主作用域之前声明您的全局变量,例如:
#include <stdio.h>
static int shared = 3;
void add(void){
shared++;
}
int main(void){
printf("%d", shared)// will print 3
add();
printf("%d", shared)// will print 4
return 0;
}
这只是一个实现你想要的例子,仅用于教育目的。你应该非常小心全局变量。
您应该将 slovnik
的地址传递给您的 nacitaj
函数。否则,nacitaj
中变量的更新在 main.
中不可见
另外,永远记得 free
任何动态分配的内存。
void nacitaj( int *pocet_slov, char ***slovnik ){
char buffer[60];
int size = 60;
while( fgets( buffer, size, stdin ) != NULL ){
*pocet_slov = *pocet_slov + 1;
// dereference slovnik to update the variable in main
// don't cast the return value of malloc or realloc
*slovnik = realloc( *slovnik, (*pocet_slov+1) * sizeof(char*) );
(*slovnik)[*pocet_slov-1] = (char*) malloc( strlen(buffer) * sizeof(char) );
buffer[strlen(buffer)-1] = '[=10=]';
strcpy( (*slovnik)[*pocet_slov-1], buffer );
}
for( int i = 0; i < *pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, (*slovnik)[i] );
}
}
int main(){
char **slovnik = NULL;
int pocet_slov = 0;
int i;
printf( "Zadavaj slova do slovniku:\n" );
// pass the address of slovnik
nacitaj( &pocet_slov, &slovnik );
for( i = 0; i < pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
// free the allocated memory
for( i = 0; i < pocet_slov; i ++ ){
free(slovnik[i]);
}
free(slovnik);
return 0;
}
我试图以两种不同的方式通过动态分配从标准输入读取输入:
1) 我从 stdin、malloc、realloc 读取并写入 main 中的数组。然后当我打印数组的那些元素时,一切正常。
2) 我在 main 中声明全局变量,然后将其放入函数中,在该函数中我从 stdin、malloc、realloc 读取并写入该数组。当我在函数中打印这些元素时,它工作正常,但是当我在函数之外这样做时,它给我分段错误。
你能检查这些代码并帮助我解决这个问题吗?
2)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*--------------------------------------------------------------------------*/
void nacitaj( int *pocet_slov, char **slovnik ){
char buffer[60];
int size = 60;
while( fgets( buffer, size, stdin ) != NULL ){
*pocet_slov = *pocet_slov + 1;
slovnik = (char**) realloc( slovnik, (*pocet_slov+1) * sizeof(char*) );
slovnik[*pocet_slov-1] = (char*) malloc( strlen(buffer) * sizeof(char) );
buffer[strlen(buffer)-1] = '[=10=]';
strcpy( slovnik[*pocet_slov-1], buffer );
}
for( int i = 0; i < *pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
}
/*---------------------------------------------------------------------------*/
int main(){
char **slovnik = NULL;
int pocet_slov = 0;
int i;
printf( "Zadavaj slova do slovniku:\n" );
nacitaj( &pocet_slov, slovnik );
for( i = 0; i < pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
return 0;
}
1)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char **slovnik = NULL;
int pocet_slov = 0;
char buffer[60];
int size = 60;
int i;
printf( "Zadavaj slova do slovniku:\n" );
while( fgets( buffer, size, stdin ) != NULL ){
pocet_slov ++;
slovnik = (char**) realloc( slovnik, (pocet_slov+1) * sizeof(char*) );
slovnik[pocet_slov-1] = (char*) malloc( strlen(buffer) * sizeof(char) );
buffer[strlen(buffer)-1] = '[=11=]';
strcpy( slovnik[pocet_slov-1], buffer );
}
for( i = 0; i < pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
return 0;
}
输入示例:
car
bird
pen
在代码 2) 中,您没有声明全局变量。您应该在主作用域之前声明您的全局变量,例如:
#include <stdio.h>
static int shared = 3;
void add(void){
shared++;
}
int main(void){
printf("%d", shared)// will print 3
add();
printf("%d", shared)// will print 4
return 0;
}
这只是一个实现你想要的例子,仅用于教育目的。你应该非常小心全局变量。
您应该将 slovnik
的地址传递给您的 nacitaj
函数。否则,nacitaj
中变量的更新在 main.
另外,永远记得 free
任何动态分配的内存。
void nacitaj( int *pocet_slov, char ***slovnik ){
char buffer[60];
int size = 60;
while( fgets( buffer, size, stdin ) != NULL ){
*pocet_slov = *pocet_slov + 1;
// dereference slovnik to update the variable in main
// don't cast the return value of malloc or realloc
*slovnik = realloc( *slovnik, (*pocet_slov+1) * sizeof(char*) );
(*slovnik)[*pocet_slov-1] = (char*) malloc( strlen(buffer) * sizeof(char) );
buffer[strlen(buffer)-1] = '[=10=]';
strcpy( (*slovnik)[*pocet_slov-1], buffer );
}
for( int i = 0; i < *pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, (*slovnik)[i] );
}
}
int main(){
char **slovnik = NULL;
int pocet_slov = 0;
int i;
printf( "Zadavaj slova do slovniku:\n" );
// pass the address of slovnik
nacitaj( &pocet_slov, &slovnik );
for( i = 0; i < pocet_slov; i ++ ){
printf( "%d. %s\n", i+1, slovnik[i] );
}
// free the allocated memory
for( i = 0; i < pocet_slov; i ++ ){
free(slovnik[i]);
}
free(slovnik);
return 0;
}