回答編集履歴

3

微修正

2021/04/18 08:18

投稿

episteme
episteme

スコア16612

test CHANGED
@@ -66,6 +66,8 @@
66
66
 
67
67
  #include <iostream>
68
68
 
69
+ #include <vector>
70
+
69
71
  #include <iterator>
70
72
 
71
73
 
@@ -76,12 +78,20 @@
76
78
 
77
79
  long lary[456];
78
80
 
81
+ std::vector<int> ivec(789);
82
+
83
+ int* iary;
84
+
79
85
 
80
86
 
81
87
  std::cout << std::size(cary) << std::endl;
82
88
 
83
89
  std::cout << std::size(lary) << std::endl;
84
90
 
91
+ std::cout << std::size(ivec) << std::endl;
92
+
93
+ //std::cout << std::size(iary) << std::endl; // ちゃんとエラーになってくれる
94
+
85
95
  }
86
96
 
87
97
  ```

2

追記

2021/04/18 08:18

投稿

episteme
episteme

スコア16612

test CHANGED
@@ -57,3 +57,31 @@
57
57
  char str[100] だったら sizeof(str) = sizeof(char[100]) だから 100でしょうけどね。
58
58
 
59
59
  んなわけで、sizeof(str) / sizeof(str[0]) がまともに動くのは str が固定長配列のときに限ります。
60
+
61
+
62
+
63
+ [おまけ] C++ なら sizeof(xxx) / sizeof(xxx[0]) あらため std::size 使いましょう。
64
+
65
+ ```C++
66
+
67
+ #include <iostream>
68
+
69
+ #include <iterator>
70
+
71
+
72
+
73
+ int main() {
74
+
75
+ char cary[123];
76
+
77
+ long lary[456];
78
+
79
+
80
+
81
+ std::cout << std::size(cary) << std::endl;
82
+
83
+ std::cout << std::size(lary) << std::endl;
84
+
85
+ }
86
+
87
+ ```

1

追記

2021/04/18 08:14

投稿

episteme
episteme

スコア16612

test CHANGED
@@ -53,3 +53,7 @@
53
53
 
54
54
 
55
55
  char* str なんだから、sizeof(str) = sizeof(char*) であり、大抵8(あるいは4) を返します。
56
+
57
+ char str[100] だったら sizeof(str) = sizeof(char[100]) だから 100でしょうけどね。
58
+
59
+ んなわけで、sizeof(str) / sizeof(str[0]) がまともに動くのは str が固定長配列のときに限ります。