C言語使用上の注意点

2491 ワード

1.関数パラメータは1級ポインタであり、関数内部パラメータのポインタの変更は元の入力ポインタ自体の値に影響しない.
void ptr_mdy(void *ptr)
{
	ptr = malloc(100);
	assert(ptr);
	printf("In the func: %x
", (unsigned int)ptr); } int main() { void * ptr = malloc(100); assert(ptr); printf("Former: %x
", (unsigned int)ptr); ptr_mdy(ptr); printf("Out of func: %x
", (unsigned int)ptr); return 0; }
ptrの値は変更されていません.
ptrの値を変更する場合は、次のように2次ポインタで変更します.
void ptr_mdy(void **ptr)
{
	*ptr = malloc(100);
	assert(*ptr);
	printf("In the func: %x
", (unsigned int)*ptr); } int main() { void * ptr = malloc(100); assert(ptr); printf("Former: %x
", (unsigned int)ptr); ptr_mdy(&ptr); printf("Out of func: %x
", (unsigned int)ptr); return 0; }

2.関数はローカル変数配列を返し、ローカル構造体ポインタ(malloc割り当てでない)エラー.関数が返されるため、スタック上のコンテンツは回収されます.
int *ptr_ret()
{
	int ptr[100] = {0};
	return ptr;
}

int main()
{
	int * ptr = ptr_ret();
	return 0;
}
関数が戻るとptrは野ポインタとなる.
3.2つの構造体が互いに含まれている場合、少なくとも一方がポインタであり、ポインタオブジェクトの構造体宣言を前に、具体的な宣言を後ろに置く.相互に含めることができない2つの構造体は、通常の変数タイプ(ポインタ以外のタイプ)です.すなわち、次のようになります.
struct b;
struct a{
	struct b * test;
};

struct b{
	struct a test;
};

4.構造体の内部には、構造体のサイズを知らないため、構造体変数(ポインタではない)を含めることはできません.
struct a{
	struct a test;
};

5.変数はヘッダファイルに定義しないでください.2つのcファイル以上にヘッダファイルが含まれていると、変数が混乱して使用されます.
6.ポインタタイプのコンテンツは、メモリコピーによって直接割り当てることはできません.例えば文字列、構造体.
7.strlen、strcmpなどの関数については、パラメータがNULLであるかどうかを確認する必要があります.そうしないと、内部でパラメータアドレスの内容にアクセスする必要があるため、strnlenを使用すると、strncmpがより安全になり、文字列の終端がないことを防止します.
8.sizeofは、cコンパイラのキーワードであり、割り当てられたメモリを静的に検出するために使用される.
9. char **argv != char copy[a][b]; argv[]は文字列を指すポインタであり、copy[]はピッチbを指す空間であり、メモリレイアウトが異なるため、直接値を割り当てることはできません.よくあるエラー
int callback(char **argv, int argc)
{
	int i;
	for (i = 0; i < argc; i++)
		printf("argv[%d]: %s
", i, argv[i]); } int main() { char copy [100][10]; memcpy(copy[1], "1", 1); memcpy(copy[2], "2", 1); memcpy(copy[3], "3", 1); callback(&copy[2], 2); return 0; }
char*argv[]をchar argv[][10]に変更すればよい.
10.データ型変換.
たとえば
int i = 16384. 
char j = i;
このとき、16384=0 x 4000なのでj=0;これにより、システム全体の論理が間違っている可能性があります.
11. int data;
int data = 10;
printf("%s", data);
これで切ります