Cの勉強を始めたばかりで、関数のパラメーターとしてポインターへのポインターを渡すことについて1つの例を実行すると、問題が見つかりました。
これは私のサンプルコードです:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* allocateIntArray(int* ptr, int size){
if (ptr != NULL){
for (int i = 0; i < size; i++){
ptr[i] = i;
}
}
return ptr;
}
void increasePointer(int** ptr){
if (ptr != NULL){
*ptr += 1; /* <----------------------------- This is line 16 */
}
}
int main()
{
int* p1 = (int*)malloc(sizeof(int)* 10);
allocateIntArray(p1, 10);
for (int i = 0; i < 10; i++){
printf("%d\n", p1[i]);
}
increasePointer(&p1);
printf("%d\n", *p1);
p1--;
free(p1);
fgets(string, sizeof(string), stdin);
return 0;
}
この問題は、16行目でに変更する*ptr+=1
と発生し*ptr++
ます。期待される結果は配列全体と数値1になるはずですが、使用*ptr++
すると結果は0になります。
間の任意のdiffirenceあります+=1
とは++
?どちらも同じだと思いました。
allocateIntArray
ように見えますがmalloc
、そうではありません。fillIntArray
代わりに提案します。2)の戻り値を利用しないallocateIntArray
。戻り値の型をに変更することをお勧めしますvoid
。3)すべきではないif (ptr != NULL)
機能でincreasePointer
あることif (*ptr != NULL)
?4)キャストインmalloc
は不要です。上記のSouravのコメントを参照してください。5)これ:で囲む必要がfor (int i = 0; i < 10; i++){ printf("%d\n", p1[i]); }
ありprintf("%d\n", *p1); p1--;
ますif(p1 != NULL)
。6)string.h
未使用です。
p+=1
のようなもの++p
ではなくp++
string
。